Release 980913

Fri Sep 11 13:14:35 1998  Andreas Mohr <100.30936@germany.net>

	* [files/file.c] [include/file.h]
	Fixed SetFilePointer to allow negative positions as in DOS.

	* [graphics/ddraw.c]
	Added some methods to IDirect3D.

	* [ole/compobj.c] [if1632/compobj.spec]
	Added/implemented CoCreateStandardMalloc16,
	CoGetClassObject, CoCreateInstance,
	LookupETask, SetETask, CoGetState16.

	* [loader/task.c]
	MakeProcInstance: return 0 if func == NULL.

	* [*/*] [tools/winapi-check]
	Added zillions of missing WINAPI's and __cdecl's.
	(oops, several caused by myself)
	Wrote script for automated checking.

	* [if1632/compobj.spec]
	Many stub names.

	* [misc/ddeml.c] [ole/compobj.c]
	Some stubs.

Tue Sep  9 21:36:48 1998  Anders Carlsson <anders.carlsson@linux.nu>

	* [dlls/comctl32/Makefile.in] [dlls/comctl32/commctrl.c]
	  [dlls/comctl32/tab.c] [include/commctrl.h] [include/tab.h]
        Added preliminary tab control support.

Sat Sep  5 16:27:20 1998  Huw D M Davies <daviesh@abacus.physics.ox.ac.uk>

	* [graphics/psdrv/*]
	More changes to the PostScript driver:
	Implemented pens and solid brushes.
	Colour/greyscale for fonts, pens and brushes.
	To get coloured output you need to have *ColorDevice set to true
	in your PPD, otherwise you'll get greyscale.
	Landscape mode now works, as does non-A4 page sizes.
	Encoding of fonts to ANSI is better, Symbol works again.

	* [objects/dc.c] [include/gdi.h] [*/*]
	Moved dc->w.{text,background}Pixel to X11DRV_PDEVICE where they
	belong.

Sat Sep  5 05:12:09 1998  Ove Kaaven <ovek@arcticnet.no>

	* [include/dosexe.h] [include/miscemu.h] [include/msdos.h]
	  [loader/dos/dosvm.c] [loader/dos/module.c] [msdos/dpmi.c]
	  [msdos/int2f.c] [msdos/interrupts.c]
	Fixed portability. Adapted some code to make it easier to
	integrate the DOS subsystem with the DPMI subsystem, made
	the DPMI simulated real-mode interrupts be handled the V86
	way. Added support for .COM files. Made int2f DPMI check
	fail, to avoid pkunzip crashing in attempting to use DPMI.
	Generally moved stuff around a little.
	It is now technically possible to load several DOS programs
	into the same memory space. Not tested, though.

Fri Sep  4 21:40:45 1998  Marcus Meissner <marcus@jet.franken.de>

	* [if1632/kernel.spec]
	Changed 500-53x stubnames accordingly to nt3.51 krnl386.exe.

	* [win32/except.c]
	Fixed one bad program behaviour, (deleting SEH while in 
	first walk). RtlUnwind is broken too I think (it should unwind
	on success, not while walking the exception chain).

	* [ole/ole2nls.c]
	Get*DefaultLCID  returns 0x400|id. expected by one application.

	* [if1632/snoop.c]
	Handle non-standard SP returns more graceful.

	* [windows/class.c]
	hinstances are mostly irrelevant for win32.

	* [memory/string.c] [misc/registry.c]
	lstrcmpi32W: use toupper for characters < 0x100. (speedup hack
	for registry.c)
	Some small speedup hacks for registry.c

Thu Sep  3 20:40:16 1998  Eric Kohl <ekohl@abo.rhein-zeitung.de>

	* [Makefile.in][configure][configure.in][dlls/Makefile.in]
	  [dlls/comctl32/Makefile.in]
	Created dlls/comctl32 and moved the common controls stuff to it.

	* [misc/version.c]
	Removed COMCTL32_DllGetVersion. The fixed function is part
	of the common controls stuff.

	* [dlls/comctl32/*.c][include/commctrl.h]
	Added structure size tests.

	* [dlls/comctl32/toolbar.c]
	Fixed a bug in TOOLBAR_GetMaxWidth().

	* [dlls/comctl32/animate.c][include/animate.h]
	  [dlls/comctl32/comboex.c][include/comboex.h]
	  [dlls/comctl32/hotkey.c][include/hotkey.h]
	  [dlls/comctl32/listview.c][include/listview.h]
	  [dlls/comctl32/commctrl.c][include/commctrl.h]
	New files. Added Animation, ComboBoxEx, Hotkey and
	Listview control dummies.

	* [dlls/comctl32/tooltips.c]
	Fixed a display bug and font selection.

	* [dlls/comctl32/comctl32undoc.c][include/commctrl.h]
	Added missing DPA functions. Fixed bugs and published the
	function prototypes.

	* [documentation/common_controls]
	Updated.

Wed Sep  2 15:43:45 1998  Patrik Stridvall <ps@leissner.se>

	* [AUTHORS] [include/authors.h]
	Added myself as a Wine author.

	* [memory/virtual.c] [objects/dc.c]
	Fixed runtime errors for Solaris.

	* [misc/ddeml.c] [objects/gdiobj.c]
	Minor fixes.

	* [win32/device.c]
	Added stubs for IFSMgr VxDCall and
	a partial implementation of IFSMgr DeviceIo.

	* [relay32/Makefile.in] [relay32/builtin32.c] [relay32/imm32.spec] 
	  [relay32/msnet32.spec] [relay32/oledlg.spec]
	Added new spec files for IMM32.DLL, MSNET32.DLL, OLEDLG.DLL.

	* [misc/Makefile.in] [misc/imm.c] [include/imm.h]
	Added news files for implementation of IMM32.DLL. 
	All functions return 0 as is correct for all Western Languages.

	* [ole/Makefile.in] [ole/oledlg.c] [include/oledlg.h]
	Added new files for implementation of OLEDLG.DLL.
	Added stubs with FIXME:s for all functions.

Wed Sep  2 10:50:00 1998  Juergen Schmied <juergen.schmied@metronet.de>

	* [dlls/shell32/contmenu.c][dlls/shell32/shellole.c]
	  [dlls/shell32/shlfolder.c][dlls/shell32/shlview.c]
	  [documentation/shell32][include/shell.h]
	Clean up, bugfixes.
	
	* [dlls/shell32/enumidlist.c]
	Fileattributes implemented.
	
	* [dlls/shell32/pidl.c]
	Class pidlmgr splited into functions, structures changed, 
	some functions rewritten.

	* [dlls/shell32/shell32_main.c]
	Small changes and bugfixes SHGetFileInfoA, SHGetSpecialFolderLocation.
	
	* [dlls/shell32/shellord.c][relay32/shell32.spec]
	Parameter documented, implemented SHCloneSpecialIDList.
	Stub improved ShellExecuteEx32A.
	New stubs SHFind_InitMenuPopup, FileMenu_InitMenuPopup, 
	FileMenu_Create, FileMenu_TrackPopupMenuEx, SHWinHelp,
	SHRunConrolPanel, DAD_ShowDragImage, FileMenu_Destroy,
	SHGetDataFromIDListA, SHFileOperationA.
	
	* [include/winnls.h][include/ole2nls.c]
	TIME_FORCE24HOURFORMAT, TIME_NOTIMEMARKER implemented
	in OLE_GetFormatA, GetTimeFormat32A.
	
	* [win32/code_page.c]
	WideCharToMultiByte: parameter checking and returning of strlen
	implemented.
	
	* [windows/keyboard.c][windows/defwnd.c]
	Debug messages added.
	
	* [windows/win.c]
	WIN_SetWindowLong GWL_STYLE and GWL_EXSTYLE implemented.

	* [controls/menu.c]
	Missing line added.

	* [include/winerror.h]
	Macros for SUCCEEDED and FAILED added.

Mon Aug 31 00:55:31 1998  Ulrich Weigand <weigand@informatik.uni-erlangen.de>

	* [loader/module.c]
	Bugfix: LoadModule16 should *not* call LoadModule32.

	* [files/dos_fs.c]
	Bugfix: don't crash if given directory doesn't exist.

Sat Aug 29 15:00:49 1998  Turchanov Sergey <turchanov@usa.net>

	* [include/mmsystem.h][multimedia/mmsystem.c][relay32/winmm.spec]
	Almost completed implementation of [snd]PlaySound (except
	flags SND_ALIAS_ID and SND_APPLICATION).

	* [if1632/user.spec][windows/winpos.c]
	Added SetWindowRgn16 stub.

Sat Aug 29 02:53:31 1998  Alexander Lukyanov <lav@long.yar.ru>

	* [files/drive.c]
	GetDriveType32A: return DRIVE_DOESNOTEXIST in case of non
	existent drive.

	* [msdos/int21.c]
	INT21_FindFirstFCB: check drive validity to prevent oops.

	* [win32/file.c]
	CreateFile32A: duplicate STD_{INPUT,OUTPUT}_HANDLE.

	* [files/dos_fs.c]
	Make DOSFS_OpenDir treat "" as "/".
	DOSFS_OpenDevice: duplicate STD_{INPUT,OUTPUT}_HANDLE.

	* [windows/dialog.c]
	GetNextDlgTabItem32: use last/first item instead of first/last
	when hwndCtrl==0. This fixes initial focus.

Sat Aug 29 02:46:32 1998  Adrian Harvey <adrian@select.com.au>

	* [include/process.h] [include/process.c]
	Renamed PROCESS_SELF to CURRENT_PROCESS_PSEUDOHANDLE in line
	with thread constant, and Win32 documentation (which calls it
	a pseudohandle.)  Made GetCurrentProcess actually use this
	constant instead of the value.

	* [include/process.h] [include/thread.h] [scheduler/thread.c]
	  [scheduler/process.c] [scheduler/handle.c]
	Modify HANDLE_GetObjPtr to understand about
	CURRENT_THREAD_PSEUDOHANDLE and CURRENT_PROCESS_PSEUDOHANDLE.
	This allows DuplicateHandle to do the correct thing with these
	handles.  Removed now duplicate functionality from THREAD_GetPtr
	and PROCESS_GetPtr.

	* [loader/ne/segment.c]
	Fixed two places where HFILE32s were being created and passed to
	16-bit code. This should unbreak NE self-loading code.
	Added two casts to remove compile time warnings.

Fri Aug 28 21:04:13 1998  Joseph Pranevich <knight@baltimore.wwaves.com>

	* [msdos/dosmem.c] [msdos/int2f.c]
	Added beginnings of DOS error table.

	* [msdos/int1a.c]
	Stub for subfunction 0xb0.

	* [msdos/int10.c] [loader/dos/dosvm.c]
	INT 10 support completely rewritten and lots of debugging
	added. Now, DOS apps that use INT 10 to write to the screen will
	work. (Beyond Zork does, at least. Somewhat.)

	* [include/miscemu.h] [msdos/dosmem.c] [msdos/int21.c]
	Another shot at getting MS's generic error message facility
	right.

	* [msdos/int21.c]
	Command.Com wanted to set its own PSP address. I let it.

Wed Aug 26 12:26:20 1998  Matthew Toseland <Matthew.Toseland@btinternet.com>

	* [include/file.h] [misc/lzexpand.c]
	Fixed LZCopy16 by fixing HFILE16/HFILE32 convertor macros so don't
	convert lzw handles.

Tue Aug 25 22:22:55 1998  Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>

	* [misc/registry.c]
	In RegEnumvalue, ivalue == 0 is a legal request and should
	return the first entry.

	* [msdos/int21.c]
	Add handling for Int21-48/49 in Win16. Makes blinker demo work.

	* [windows/winproc.c]
	Add Msg32A<->Msg32W translation for LB_ADDSTRING.

Tue Aug 25 21:03:31 1998  Kristian Nielsen  <kristian.nielsen@risoe.dk>

	* [windows/win.c]
	Fix for SetParent(): MS Windows 3.11 does not clear the WS_CHILD
	flag when a child window is reparented to the desktop window.

Mon Aug 24 20:55:22 1998  Berend Reitsma <berend at asset-control dot com>

	* [controls/menu.c]
	Menus created with SetMenuItemInfo and InsertMenuItem should
	work now.

Sun Aug 23 23:23:23 1998  Alex Korobka <korobka@ams.sunysb.edu>

	* [controls/combo.c]
	Added CB_GETITEMHEIGHT.

	* [windows/winpos.c] 
	WM_NCHITTEST, SWP_FRAMECHANGED bugfixes.

Sat Aug 22 21:15:29 1998 Alex Priem <alexp@sci.kun.nl>

	* [files/profile.c] [include/windows.h]
	Added GetPrivateProfileSectionNames[AW],GetPrivateProfileSectionW,
	GetPrivateProfileStructW, GetProfileSectionW,
	WriteProfileSection[AW], WritePrivateProfileStructW. 
diff --git a/controls/Makefile.in b/controls/Makefile.in
index a49d710..e2369d6 100644
--- a/controls/Makefile.in
+++ b/controls/Makefile.in
@@ -8,27 +8,14 @@
 C_SRCS = \
 	button.c \
 	combo.c \
-	comctl32undoc.c \
-	commctrl.c \
 	desktop.c \
 	edit.c \
-	header.c \
 	icontitle.c \
 	listbox.c \
-	listview.c \
 	menu.c \
-	pager.c \
-	progress.c \
-	rebar.c \
 	scroll.c \
 	static.c \
-	status.c \
-	toolbar.c \
-	tooltips.c \
-	trackbar.c \
-	treeview.c \
 	uitools.c \
-	updown.c \
 	widgets.c
 
 all: $(MODULE).o
diff --git a/controls/combo.c b/controls/combo.c
index 1b8e1d7..b7a44db 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -129,6 +129,7 @@
    return 0;
 }
 
+
 /***********************************************************************
  *           CBCalcPlacement
  *
@@ -142,22 +143,6 @@
 
    /* get combo height and width */
 
-   if( lphc->editHeight )
-       size.cy = lphc->editHeight;
-   else
-   {
-       HDC32	hDC = GetDC32( lphc->self->hwndSelf );
-       HFONT32	hPrevFont = 0;
-
-       if( lphc->hFont ) hPrevFont = SelectObject32( hDC, lphc->hFont );
-   
-       GetTextExtentPoint32A( hDC, "0", 1, &size);
-
-       size.cy += size.cy / 4 + 4 * SYSMETRICS_CYBORDER;
-
-       if( hPrevFont ) SelectObject32( hDC, hPrevFont );
-       ReleaseDC32( lphc->self->hwndSelf, hDC );
-   }
    size.cx = rect.right - rect.left;
 
    if( CB_OWNERDRAWN(lphc) )
@@ -181,6 +166,23 @@
        }
        size.cy = u;
    }
+   else if( lphc->editHeight ) /* explicitly set height */
+	size.cy = lphc->editHeight;
+   else
+   {
+       HDC32    hDC = GetDC32( lphc->self->hwndSelf );
+       HFONT32  hPrevFont = 0;
+
+       if( lphc->hFont ) hPrevFont = SelectObject32( hDC, lphc->hFont );
+
+       GetTextExtentPoint32A( hDC, "0", 1, &size);
+
+       size.cy += size.cy / 4 + 4 * SYSMETRICS_CYBORDER;
+
+       if( hPrevFont ) SelectObject32( hDC, hPrevFont );
+       ReleaseDC32( lphc->self->hwndSelf, hDC );
+   }
+
 
    /* calculate text and button placement */
 
@@ -1419,10 +1421,17 @@
 		return SendMessage32A( lphc->hWndLBox, LB_FINDSTRINGEXACT32, 
 						       wParam, lParam );
 	case CB_SETITEMHEIGHT16:
-		wParam = (INT32)(INT16)wParam;
+		wParam = (INT32)(INT16)wParam; /* signed integer */
 	case CB_SETITEMHEIGHT32:
 		return COMBO_SetItemHeight( lphc, (INT32)wParam, (INT32)lParam);
 
+	case CB_GETITEMHEIGHT16:
+		wParam = (INT32)(INT16)wParam;
+	case CB_GETITEMHEIGHT32:
+		if( (INT32)wParam >= 0 )
+		    return SendMessage32A( lphc->hWndLBox, LB_GETITEMHEIGHT32, wParam, 0);
+		return (lphc->RectEdit.bottom - lphc->RectEdit.top);
+
 	case CB_RESETCONTENT16: 
 	case CB_RESETCONTENT32:
 		SendMessage32A( lphc->hWndLBox, LB_RESETCONTENT32, 0, 0 );
diff --git a/controls/comctl32undoc.c b/controls/comctl32undoc.c
deleted file mode 100644
index aa5c83d..0000000
--- a/controls/comctl32undoc.c
+++ /dev/null
@@ -1,586 +0,0 @@
-/*
- * Undocumented functions from COMCTL32.DLL
- *
- * Copyright 1998 Eric Kohl <ekohl@abo.rhein-zeitung.de>
- *           1998 Juergen Schmied <j.schmied@metronet.de>
- * NOTES
- *     All of these functions are UNDOCUMENTED!! And I mean UNDOCUMENTED!!!!
- *     Do NOT rely on names or contents of undocumented structures and types!!!
- *     These functions are used by EXPLORER.EXE, IEXPLORE.EXE and
- *     COMCTL32.DLL (internally).
- *
- * TODO
- *     - Fix DSA_InsertItem.
- *     - Fix DSA_GetItem.
- *     - Write documentation.
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include "windows.h"
-#include "heap.h"
-#include "debug.h"
-
-typedef struct _DPA_DATA
-{
-    DWORD   dwEntryCount;
-    DWORD   dwMaxCount;
-    DWORD   dwGrow;
-    LPDWORD ptrs; 
-} DPA_DATA, *LPDPA_DATA;
-
-
-DWORD WINAPI DPA_Create (DWORD);
-DWORD WINAPI DPA_GetPtr (DWORD, DWORD);
-DWORD WINAPI DPA_InsertPtr (DWORD, DWORD, DWORD);
-
-
-CRITICAL_SECTION cs_comctl_alloc;
-HANDLE32 hComctl32Heap=0;
-/**************************************************************************
- * Alloc [COMCTL32.71]
- *
- */
-
-LPVOID WINAPI COMCTL32_Alloc (DWORD dwParam)
-{   LPVOID lpPtr;
-
-    TRACE (commctrl, "(0x%08lx)\n", dwParam);
-
-	if (hComctl32Heap==0)
-	{ EnterCriticalSection((void*)&cs_comctl_alloc);
-      hComctl32Heap=HeapCreate(0,1,0x4000000);
-      LeaveCriticalSection((void*)&cs_comctl_alloc);
-      TRACE (commctrl, "Heap created: 0x%08x\n", hComctl32Heap);
-      if (! hComctl32Heap)
-        return FALSE;        
-	}
-
-//    lpPtr = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, dwParam);
-    lpPtr = HeapAlloc (hComctl32Heap, HEAP_ZERO_MEMORY, dwParam);
-    TRACE (commctrl, "-- ret=%p\n", lpPtr);
-    return lpPtr;
-}
-
-
-/**************************************************************************
- * ReAlloc [COMCTL32.72]
- *
- */
-
-LPVOID WINAPI
-COMCTL32_ReAlloc (LPVOID dwParam1, DWORD dwParam2)
-{
-    LPVOID dwPtr;
-    TRACE (commctrl, "(0x%08lx 0x%08lx)\n",(DWORD)dwParam1, dwParam2);
-    
-    if (dwParam1 == 0)
-	dwPtr = HeapAlloc (hComctl32Heap, HEAP_ZERO_MEMORY,
-			   dwParam2);
-    else
-	dwPtr = HeapReAlloc (hComctl32Heap, HEAP_ZERO_MEMORY,
-			     dwParam1, dwParam2);
-
-    TRACE (commctrl, "-- ret=0x%08lx\n", (DWORD)dwPtr);
-
-    return dwPtr;
-}
-
-
-/**************************************************************************
- * Free [COMCTL32.73]
- *
- */
-
-DWORD WINAPI
-COMCTL32_Free (LPVOID dwParam)
-{
-    TRACE (commctrl, "(0x%08lx)\n", (DWORD)dwParam);
-    HeapFree (hComctl32Heap, 0, dwParam);
-
-    return 0;
-}
-
-
-/**************************************************************************
- * GetSize [COMCTL32.74]
- *
- */
-
-DWORD WINAPI
-COMCTL32_GetSize (LPVOID dwParam)
-{
-    TRACE (commctrl, "(0x%08lx)\n", (DWORD)dwParam);
-    return (HeapSize (hComctl32Heap, 0, dwParam));
-}
-
-
-
-/**************************************************************************
- * Str_SetPtrA [COMCTL32.234]
- *
- * PARAMS
- *     dwParam1 [I]
- *     dwParam2 [I]
- */
-
-BOOL32 WINAPI
-COMCTL32_Str_SetPtrA (LPSTR lpStr, LPVOID *lpPtr)
-{
-    INT32 len;
-    LPSTR ptr;
-
-    FIXME (commctrl, "(0x%08lx 0x%08lx)\n", (DWORD)lpStr, (DWORD)lpPtr);
-    FIXME (commctrl, "(\"%s\" \"%s\")\n", lpStr, (LPSTR)*lpPtr);
-
-    if (lpStr) {
-	len = lstrlen32A (lpStr);
-	ptr = COMCTL32_ReAlloc (lpPtr, len + 1);
-	if (!(ptr))
-	    return FALSE;
-	lstrcpy32A (ptr, lpStr);
-	*lpPtr = ptr;
-	return TRUE;
-    }
-
-    if (*lpPtr) {
-	COMCTL32_Free (*lpPtr);
-	return TRUE;
-    }
-
-    return FALSE;
-}
-
-/*************************************************************************
-* The DSA-API is a set of functions to create and manipulate arrays of
-* fix sized memory blocks. This arrays can store any kind of data (strings,
-* icons...) so the name "dynamic string array" is a bit misleading.
-*
-* STATUS 
-*  complete
-*/
-typedef struct _DSA_DATA
-{   DWORD   dwEntryCount;
-    BYTE    * pData;
-    DWORD   dwMaxCount;
-    DWORD   dwElementSize;
-    DWORD   dwGrow;
-} DSA_DATA, *LPDSA_DATA;
-
-/**************************************************************************
- * DSA_Create [COMCTL32.320] Creates a dynamic string array
- *
- * PARAMS
- *     dwSize [I] size of the array elements
- *     dwGrow [I] 
- * RETURNS
- *     pointer to a array control structure. use this like a handle.
- */
-
-LPDSA_DATA WINAPI DSA_Create (DWORD dwSize, DWORD dwGrow)
-{   LPDSA_DATA dsaPtr;
-
-    TRACE (commctrl, "(size=0x%08lx grow=0x%08lx)\n", dwSize, dwGrow);
-
-    if ((dsaPtr=(LPDSA_DATA)COMCTL32_Alloc(sizeof(DSA_DATA))));
-    {  dsaPtr->dwEntryCount=0x00;
-       dsaPtr->pData=NULL;
-       dsaPtr->dwMaxCount=0x00;
-       dsaPtr->dwElementSize=dwSize;
-       if ( dwGrow == 0 )
-         dsaPtr->dwGrow=1;
-       else
-         dsaPtr->dwGrow=dwGrow;
-       return dsaPtr;
-    }
-    return FALSE;   
-}
-
-/**************************************************************************
- * DSA_Destroy [COMCTL32.321] Destroys a dynamic string array
- *
- * PARAMS
- *     dsaPtr [I] pointer to the array control structure
- * RETURNS
- *  TRUE if dsaPtr = NULL or success
- *  FALSE if failure
- */
-
-BOOL32 WINAPI DSA_Destroy (const LPDSA_DATA dsaPtr )
-{   TRACE (commctrl, "(%p)\n", dsaPtr);
-
-	if (! dsaPtr)
-      return FALSE;
-
-    if (dsaPtr->pData && (! COMCTL32_Free(dsaPtr->pData)))
-    { return FALSE;
-    }
-    return COMCTL32_Free (dsaPtr);
-}
-
-/**************************************************************************
- * DSA_GetItem [COMCTL32.322] 
- *
- * PARAMS
- *  dsaPtr [I] pointer to the array control structure
- *  dwItem [I] number of the Item to get
-+ *  pDest  [O] destination buffer. Has to be >= dwElementSize.
- */
-
-BOOL32 WINAPI DSA_GetItem (const LPDSA_DATA dsaPtr, DWORD dwItem, LPBYTE pDest)
-{   BYTE * pSrc;
-
-    TRACE (commctrl, "(%p 0x%08lx %p)\n", dsaPtr, dwItem, pDest);
-    
-    if ( (!dsaPtr) || (dwItem < 0) || (dwItem >= dsaPtr->dwEntryCount))
-      return FALSE;
-    
-    pSrc = dsaPtr->pData + (dsaPtr->dwElementSize * dwItem);
-    memmove(pDest,pSrc,dsaPtr->dwElementSize);
-    return TRUE;
-}
-
-/**************************************************************************
- * DSA_GetItemPtr [COMCTL32.323] 
- *
- * PARAMS
- *  dsaPtr [I] pointer to the array control structure
- *  dwItem [I] number of the Item to get
- * RETURNS
- *  pointer ti a item 
- */
-LPBYTE WINAPI DSA_GetItemPtr (const LPDSA_DATA dsaPtr, DWORD dwItem)
-{   BYTE * pSrc;
-
-	TRACE (commctrl, "(%p 0x%08lx)\n", dsaPtr, dwItem);
-
-    if ((!dsaPtr) || (dwItem < 0) || (dwItem >= dsaPtr->dwEntryCount))
-	  return FALSE;
-    pSrc = dsaPtr->pData + (dsaPtr->dwElementSize * dwItem);
-    
-    TRACE (commctrl, "-- ret=%p\n", pSrc);
-
-    return  pSrc;
-}
-
-/**************************************************************************
- * DSA_SetItem [COMCTL32.325] 
- *
- * PARAMS
- *  dsaPtr [I] pointer to the array control structure
- *  dwItem [I] index for the new element
- *  pSrc   [I] the element
- */
-BOOL32 WINAPI DSA_SetItem (const LPDSA_DATA dsaPtr, DWORD dwItem, LPBYTE pSrc)
-{   LPBYTE pDest;
- 	DWORD  dwSize, dwNewItems;
-	LPBYTE lpTemp;
-    
-    TRACE (commctrl, "(%p 0x%08lx %p)\n", dsaPtr, dwItem, pSrc);
-
-	if ((!dsaPtr) || dwItem<0 )
-      return FALSE;
-      
-    if (dsaPtr->dwEntryCount <= dwItem)	/* within the old array */
-    { if ( dsaPtr->dwMaxCount > dwItem) 
-      { dsaPtr->dwEntryCount = dwItem; /* within the allocated space, set a new boundary */
-      }
-      else
-      { /* resize the block of memory*/
-        dwNewItems = dsaPtr->dwGrow * ( (WORD)((dwItem-1)/dsaPtr->dwGrow) +1);
-        dwSize = dsaPtr->dwElementSize * dwNewItems;
-        lpTemp = (LPBYTE) COMCTL32_ReAlloc(dsaPtr->pData,dwSize);
-        if (! lpTemp )
-        { return FALSE;
-        }
-        dsaPtr->dwMaxCount = dwNewItems;
-        dsaPtr->pData = lpTemp;        
-      }    
-    }
-	/* put the new entry in */
-	pDest = dsaPtr->pData +  (dsaPtr->dwElementSize * dwItem);
-    TRACE (commctrl,"move dest=%p src=%p size=%x",pDest,pSrc,dsaPtr->dwElementSize);
-	memmove(pDest,pSrc,dsaPtr->dwElementSize);
-    return TRUE;
-}
-
-/**************************************************************************
- * DSA_InsertItem [COMCTL32.325] 
- *
- * PARAMS
- *  dsaPtr [I] pointer to the array control structure
- *  dwItem [I] index for the new element
- *  pSrc   [I] the element
- *
- * RETURNS
- *  the position of the new element
- */
-DWORD WINAPI DSA_InsertItem (const LPDSA_DATA dsaPtr, DWORD dwItem, LPBYTE pSrc)
-{	DWORD dwNewItems, dwSize,i;
-	LPBYTE lpTemp, lpDest;
-    LPDWORD p;
-    
-	TRACE(commctrl, "(%p 0x%08lx %p)\n", dsaPtr, dwItem, pSrc);
-
-	if ( (!dsaPtr) || dwItem<0 )
-      return -1;
-
-	for (i=0; i<dsaPtr->dwElementSize;i+=4)
-    { p = *(DWORD**)(pSrc+i);
-      if ( IsBadStringPtr32A ((char*)p,256))
-      { TRACE(commctrl,"-- 0x%04lx=%p\n",i,(DWORD*)p);
-      }
-      else
-      { TRACE(commctrl,"-- 0x%04lx=%p [%s]\n",i,p,debugstr_a((char*)p));
-      }
-    }
-    
-    if (dwItem > dsaPtr->dwEntryCount)		/* when dwItem > dwEntryCount then append*/
-      dwItem = dsaPtr->dwEntryCount+1;
-    
-    if (dwItem >= dsaPtr->dwMaxCount)		/* do we need to resize ? */
-    { dwNewItems = dsaPtr->dwMaxCount + dsaPtr->dwGrow;
-      dwSize = dsaPtr->dwElementSize * dwNewItems;
-	  lpTemp = (LPBYTE)COMCTL32_ReAlloc(dsaPtr->pData,dwSize);
-      if (!lpTemp)
-      { return -1;
-      }
-      dsaPtr->dwMaxCount = dwNewItems;
-      dsaPtr->pData = lpTemp;         
-    }
-
-    if (dwItem < dsaPtr->dwEntryCount)		/* do we need to move elements ?*/
-	{ lpTemp = dsaPtr->pData + (dsaPtr->dwElementSize * dwItem);
-      lpDest = lpTemp + dsaPtr->dwElementSize;
-      TRACE (commctrl,"-- move dest=%p src=%p size=%x\n",lpDest,lpTemp,dsaPtr->dwElementSize);
-      memmove (lpDest,lpTemp,dsaPtr->dwElementSize);
-    } 
-    /* ok, we can put the new Item in*/
-    dsaPtr->dwEntryCount++;
-    lpDest = dsaPtr->pData + (dsaPtr->dwElementSize * dwItem);
-    TRACE (commctrl,"-- move dest=%p src=%p size=%x\n",lpDest,pSrc,dsaPtr->dwElementSize);
-	memmove (lpDest,pSrc,dsaPtr->dwElementSize);
-	return dsaPtr->dwEntryCount;
-}
-/**************************************************************************
- * DSA_DeleteItem [COMCTL32.326] 
- *
- * PARAMS
- *  dsaPtr [I] pointer to the array control structure
- *  dwItem [I] index for the element to delete
- * RETURNS
- *  number of the element deleted
- */
-DWORD WINAPI DSA_DeleteItem (const LPDSA_DATA dsaPtr, DWORD dwItem)
-{	LPBYTE	lpDest,lpSrc;
-	DWORD	dwSize;
-    
-    TRACE (commctrl, "(%p 0x%08lx)\n", dsaPtr, dwItem);
-
-	if ( (! dsaPtr) || dwItem<0 || dwItem>=dsaPtr->dwEntryCount)
-      return FALSE;
-
-    if ( dwItem < dsaPtr->dwEntryCount-1 )	/* do we need to move ?*/
-	{ lpDest = dsaPtr->pData + (dsaPtr->dwElementSize * dwItem);
-      lpSrc = lpDest + dsaPtr->dwElementSize;
-      dwSize = dsaPtr->dwElementSize * (dsaPtr->dwEntryCount-dwItem-1);
-      TRACE (commctrl,"-- move dest=%p src=%p size=%x\n",lpDest,lpSrc,dwSize);
-      memmove (lpDest,lpSrc,dwSize);
-	}
-    
-    dsaPtr->dwEntryCount--;
-    
-    if ( (dsaPtr->dwMaxCount-dsaPtr->dwEntryCount) >= dsaPtr->dwGrow) /* free memory ?*/
-    { dwSize = dsaPtr->dwElementSize * dsaPtr->dwEntryCount;
-      lpDest = (LPBYTE) COMCTL32_ReAlloc(dsaPtr->pData,dwSize);
-      if (!lpDest)
-      { return FALSE;
-      }
-      dsaPtr->dwMaxCount = dsaPtr->dwEntryCount;
-      dsaPtr->pData = lpDest;         
-
-    }
-    return dwItem;
-}
-
-/**************************************************************************
- * DSA_DeleteAllItems [COMCTL32.326] 
- *  deletes all elements and initializes array
- *
- * PARAMS
- *  dsaPtr [I] pointer to the array control structure
- *
- * RETURNS
- *  TRUE/FALSE
- */
-BOOL32 WINAPI DSA_DeleteAllItems (const LPDSA_DATA dsaPtr)
-{   TRACE (commctrl, "(%p)\n", dsaPtr);
-
-	if (! dsaPtr) 
-      return FALSE;
-
-    if (dsaPtr->pData && (! COMCTL32_Free(dsaPtr->pData)))
-    { return FALSE;
-    }
-	dsaPtr->dwEntryCount=0x00;
-    dsaPtr->pData=NULL;
-    dsaPtr->dwMaxCount=0x00;
-    return TRUE;
-}
-/**************************************************************************/
-
-
-DWORD WINAPI
-DPA_Create (DWORD dwParam1)
-{
-    LPDPA_DATA dpaPtr;
-
-    TRACE (commctrl, "(0x%08lx)\n", dwParam1);
-
-    dpaPtr = (LPDPA_DATA)HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY, sizeof(DPA_DATA));
-    dpaPtr->dwGrow = dwParam1;
-
-    TRACE (commctrl, "ret=0x%08lx\n", (DWORD)dpaPtr);
-
-    return (DWORD)dpaPtr;
-}
-
-
-
-DWORD WINAPI
-DPA_GetPtr (DWORD dwParam1, DWORD dwParam2)
-{
-    LPDPA_DATA dpaPtr = (LPDPA_DATA)dwParam1;
-
-    TRACE (commctrl, "(0x%08lx 0x%08lx)\n", dwParam1, dwParam2);
-
-    if (dpaPtr == NULL)
-	return 0;
-    if (dpaPtr->ptrs == NULL)
-	return 0;
-    if ((dwParam2 < 0) || (dwParam2 >= dpaPtr->dwEntryCount))
-	return 0;
-
-    TRACE (commctrl, "ret=0x%08lx\n", (DWORD)dpaPtr->ptrs[dwParam2]);
-
-    return (DWORD)dpaPtr->ptrs[dwParam2];
-}
-
-
-
-DWORD WINAPI
-DPA_InsertPtr (DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
-{
-    LPDPA_DATA dpaPtr = (LPDPA_DATA)dwParam1;
-    DWORD dwIndex;
-
-    TRACE (commctrl, "(0x%08lx 0x%08lx 0x%lx)\n",
-	   dwParam1, dwParam2, dwParam3);
-
-    if (dpaPtr->ptrs == NULL) {
-	dpaPtr->ptrs = (LPDWORD)HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
-					   dpaPtr->dwGrow * sizeof(LPVOID));
-	dpaPtr->dwMaxCount = dpaPtr->dwGrow;
-        dwIndex = 0;
-        dpaPtr->ptrs[dwIndex] = dwParam3;
-    }
-    else {
-	FIXME (commctrl, "adding to existing array! stub!\n");
-
-
-	dwIndex = dwParam2;
-    }
-
-    dpaPtr->dwEntryCount++;
-
-    return (dwIndex);
-}
-
-
-/**************************************************************************
- * DPA_CreateEx [COMCTL32.340]
- *
- */
-
-DWORD WINAPI
-DPA_CreateEx (DWORD dwParam1, DWORD dwParam2)
-{
-    FIXME (commctrl, "(0x%08lx 0x%08lx)\n",
-	   dwParam1, dwParam2);
-
-    return 0;
-}
-
-
-/**************************************************************************
- * SendNotify [COMCTL32.341]
- *
- */
-
-DWORD WINAPI
-COMCTL32_SendNotify (DWORD dw1, DWORD dw2, DWORD dw3, DWORD dw4)
-{
-    FIXME (commctrl, "(0x%08lx 0x%08lx 0x%08lx 0x%08lx)\n",
-	   dw1, dw2, dw3, dw4);
-
-    return 0;
-}
-
-
-
-/**************************************************************************
- * StrChrA [COMCTL32.350]
- *
- */
-
-LPSTR WINAPI
-COMCTL32_StrChrA (LPCSTR lpString, CHAR cChar)
-{
-    return strchr (lpString, cChar);
-}
-
-
-/**************************************************************************
- * StrStrIA [COMCTL32.355]
- */
-
-LPSTR WINAPI
-COMCTL32_StrStrIA (LPCSTR lpStr1, LPCSTR lpStr2)
-{
-    INT32 len1, len2, i;
-    CHAR  first;
-
-    if (*lpStr2 == 0)
-	return ((LPSTR)lpStr1);
-    len1 = 0;
-    while (lpStr1[len1] != 0) ++len1;
-    len2 = 0;
-    while (lpStr2[len2] != 0) ++len2;
-    if (len2 == 0)
-	return ((LPSTR)(lpStr1 + len1));
-    first = tolower (*lpStr2);
-    while (len1 >= len2) {
-	if (tolower(*lpStr1) == first) {
-	    for (i = 1; i < len2; ++i)
-		if (tolower (lpStr1[i]) != tolower(lpStr2[i]))
-		    break;
-	    if (i >= len2)
-		return ((LPSTR)lpStr1);
-        }
-	++lpStr1; --len1;
-    }
-    return (NULL);
-}
-
-
-/**************************************************************************
- * StrToIntA [COMCTL32.357] Converts a string to a signed integer.
- */
-
-INT32 WINAPI
-COMCTL32_StrToIntA (LPSTR lpString)
-{
-    return atoi(lpString);
-}
-
diff --git a/controls/commctrl.c b/controls/commctrl.c
deleted file mode 100644
index 629fc50..0000000
--- a/controls/commctrl.c
+++ /dev/null
@@ -1,596 +0,0 @@
-/*		
- * Common controls functions
- *
- * Copyright 1997 Dimitrie O. Paun
- * Copyright 1998 Eric Kohl
- *
- */
-
-#include "win.h"
-#include "heap.h"
-#include "commctrl.h"
-#include "header.h"
-#include "listview.h"
-#include "pager.h"
-#include "progress.h"
-#include "rebar.h"
-#include "status.h"
-#include "toolbar.h"
-#include "tooltips.h"
-#include "trackbar.h"
-#include "treeview.h"
-#include "updown.h"
-#include "debug.h"
-
-
-/***********************************************************************
- * ComCtl32LibMain [Internal] Initializes the internal 'COMCTL32.DLL'.
- *
- * PARAMS
- *     hinstDLL    [I]
- *     fdwReason   [I]
- *     lpvReserved [I]
- *
- */
-
-BOOL32 WINAPI
-ComCtl32LibMain (HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
-{
-    TRACE (commctrl, "%x,%lx,%p\n", hinstDLL, fdwReason, lpvReserved);
-
-    switch (fdwReason) {
-	case DLL_PROCESS_ATTACH:
-	    TRACE (commctrl, "No animation class implemented!\n");
-	    HEADER_Register ();
-	    TRACE (commctrl, "No hotkey class implemented!\n");
-	    LISTVIEW_Register ();
-	    PROGRESS_Register ();
-	    STATUS_Register ();
-	    TRACE (commctrl, "No tab class implemented!\n");
-	    TOOLBAR_Register ();
-	    TOOLTIPS_Register ();
-	    TRACKBAR_Register ();
-	    TREEVIEW_Register ();
-	    UPDOWN_Register ();
-	    break;
-    }
-
-    return TRUE;
-}
-
-
-/***********************************************************************
- * DrawStatusText32A [COMCTL32.5][COMCTL32.27]
- *
- * Draws text with borders, like in a status bar.
- *
- * PARAMS
- *     hdc   [I] handle to the window's display context
- *     lprc  [I] pointer to a rectangle
- *     text  [I] pointer to the text
- *     style [I] 
- */
-
-VOID WINAPI
-DrawStatusText32A (HDC32 hdc, LPRECT32 lprc, LPCSTR text, UINT32 style)
-{
-    RECT32 r = *lprc;
-    UINT32 border = BDR_SUNKENOUTER;
-
-    if (style == SBT_POPOUT)
-      border = BDR_RAISEDOUTER;
-    else if (style == SBT_NOBORDERS)
-      border = 0;
-
-    DrawEdge32 (hdc, &r, border, BF_RECT|BF_ADJUST|BF_MIDDLE);
-
-    /* now draw text */
-    if (text) {
-      int oldbkmode = SetBkMode32 (hdc, TRANSPARENT);
-      r.left += 3;
-      DrawText32A (hdc, text, lstrlen32A(text),
-		   &r, DT_LEFT|DT_VCENTER|DT_SINGLELINE);  
-      if (oldbkmode != TRANSPARENT)
-	SetBkMode32(hdc, oldbkmode);
-    }
-}
-
-
-/***********************************************************************
- * DrawStatusText32W [COMCTL32.28]
- *
- * Draws text with borders, like in a status bar.
- *
- * PARAMS
- *     hdc   [I] handle to the window's display context
- *     lprc  [I] pointer to a rectangle
- *     text  [I] pointer to the text
- *     style [I] 
- */
-
-VOID WINAPI
-DrawStatusText32W (HDC32 hdc, LPRECT32 lprc, LPCWSTR text, UINT32 style)
-{
-  LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, text );
-  DrawStatusText32A(hdc, lprc, p, style);
-  HeapFree( GetProcessHeap(), 0, p );         
-}
-
-
-/***********************************************************************
- * CreateStatusWindow32A [COMCTL32.6][COMCTL32.21]
- */
-HWND32 WINAPI CreateStatusWindow32A( INT32 style, LPCSTR text, HWND32 parent,
-                                     UINT32 wid )
-{
-    return CreateWindow32A(STATUSCLASSNAME32A, text, style, 
-			   CW_USEDEFAULT32, CW_USEDEFAULT32,
-			   CW_USEDEFAULT32, CW_USEDEFAULT32, 
-			   parent, wid, 0, 0);
-}
-
-
-/***********************************************************************
- *           CreateStatusWindow32W   (COMCTL32.22)
- */
-HWND32 WINAPI CreateStatusWindow32W( INT32 style, LPCWSTR text, HWND32 parent,
-                                     UINT32 wid )
-{
-    return CreateWindow32W((LPCWSTR)STATUSCLASSNAME32W, text, style, 
-			   CW_USEDEFAULT32, CW_USEDEFAULT32,
-			   CW_USEDEFAULT32, CW_USEDEFAULT32, 
-			   parent, wid, 0, 0);
-}
-
-/***********************************************************************
- *           CreateUpDownControl  (COMCTL32.16)
- */
-HWND32 WINAPI CreateUpDownControl( DWORD style, INT32 x, INT32 y,
-                                   INT32 cx, INT32 cy, HWND32 parent,
-                                   INT32 id, HINSTANCE32 inst, HWND32 buddy,
-                                   INT32 maxVal, INT32 minVal, INT32 curVal )
-{
-  HWND32 hUD = CreateWindow32A(UPDOWN_CLASS32A, 0, style, x, y, cx, cy,
-			       parent, id, inst, 0);
-  if(hUD){
-    SendMessage32A(hUD, UDM_SETBUDDY, buddy, 0);
-    SendMessage32A(hUD, UDM_SETRANGE, 0, MAKELONG(maxVal, minVal));
-    SendMessage32A(hUD, UDM_SETPOS, 0, MAKELONG(curVal, 0));     
-  }
-
-  return hUD;
-}
-
-
-/***********************************************************************
- * InitCommonControls [COMCTL32.17]
- *
- * Registers the common controls.
- *
- * PARAMS
- *     None.
- *
- * NOTES
- *     This function is just a dummy.
- *     The Win95 controls are registered at the DLL's initialization.
- *     To register other controls InitCommonControlsEx must be used.
- */
-
-VOID WINAPI
-InitCommonControls (VOID)
-{
-}
-
-
-/***********************************************************************
- * InitCommonControlsEx [COMCTL32.81]
- *
- * Registers the common controls.
- *
- * PARAMS
- *     lpInitCtrls [I] pointer to a INITCOMMONCONTROLS structure.
- *
- * NOTES
- *     Only the additinal common controls are registered by this function.
- *     The Win95 controls are registered at the DLL's initialization.
- */
-
-BOOL32 WINAPI
-InitCommonControlsEx (LPINITCOMMONCONTROLSEX lpInitCtrls)
-{
-  INT32 cCount;
-  DWORD dwMask;
-
-  TRACE(commctrl,"\n");
-  
-  if (lpInitCtrls == NULL) return FALSE;
-  if (lpInitCtrls->dwSize < sizeof(INITCOMMONCONTROLSEX)) return FALSE;
-
-  for (cCount = 0; cCount < 32; cCount++) {
-    dwMask = 1 << cCount;
-    if (!(lpInitCtrls->dwICC & dwMask))
-      continue;
-
-    switch (lpInitCtrls->dwICC & dwMask) {
-      /* dummy initialization */
-      case ICC_ANIMATE_CLASS:
-      case ICC_BAR_CLASSES:
-      case ICC_LISTVIEW_CLASSES:
-      case ICC_TREEVIEW_CLASSES:
-      case ICC_TAB_CLASSES:
-      case ICC_UPDOWN_CLASS:
-      case ICC_PROGRESS_CLASS:
-      case ICC_HOTKEY_CLASS:
-        break;
-
-      /* advanced classes - not included in Win95 */
-      case ICC_DATE_CLASSES:
-        TRACE (commctrl, "No month calendar class implemented!\n");
-        TRACE (commctrl, "No date picker class implemented!\n");
-        TRACE (commctrl, "No time picker class implemented!\n");
-        UPDOWN_Register ();
-        break;
-
-      case ICC_USEREX_CLASSES:
-        TRACE (commctrl, "No comboex class implemented!\n");
-        break;
-
-      case ICC_COOL_CLASSES:
-	REBAR_Register ();
-        break;
-
-      case ICC_INTERNET_CLASSES:
-        TRACE (commctrl, "No IPAddress class implemented!\n");
-        break;
-
-      case ICC_PAGESCROLLER_CLASS:
-	PAGER_Register ();
-        break;
-
-      case ICC_NATIVEFNTCTL_CLASS:
-        TRACE (commctrl, "No native font class implemented!\n");
-        break;
-
-      default:
-        WARN (commctrl, "Unknown class! dwICC=0x%lX\n", dwMask);
-        break;
-    }
-  }
-
-  return TRUE;
-}
-
-
-/***********************************************************************
- * MenuHelp [COMCTL32.2]
- *
- * PARAMS
- *     uMsg
- *     wParam
- *     lParam
- *     hMainMenu
- *     hInst
- *     hwndStatus
- *     lpwIDs
- *
- * NOTES
- *     Some features are still missing because of incomplete WM_MENUSELECT
- *     messages (16->32 bit conversion).
- */
-
-VOID WINAPI
-MenuHelp (UINT32 uMsg, WPARAM32 wParam, LPARAM lParam, HMENU32 hMainMenu,
-	  HINSTANCE32 hInst, HWND32 hwndStatus, LPUINT32 lpwIDs)
-{
-    char szStatusText[128];
-
-    if (!IsWindow32 (hwndStatus)) return;
-
-    switch (uMsg) {
-	case WM_MENUSELECT:
-            TRACE (commctrl, "WM_MENUSELECT wParam=0x%X lParam=0x%lX\n",
-                   wParam, lParam);
-
-            if ((HIWORD(wParam) == 0xFFFF) && (lParam == 0)) {
-                /* menu was closed */
-                SendMessage32A (hwndStatus, SB_SIMPLE, FALSE, 0);
-            }
-            else {
-                if (HIWORD(wParam) & MF_POPUP) {
-		    FIXME (commctrl, "popup 0x%08x 0x%08lx\n", wParam, lParam);
-
-                    szStatusText[0] = 0;
-                }
-                else {
-                    TRACE (commctrl, "menu item selected!\n");
-                    if (!LoadString32A (hInst, LOWORD(wParam), szStatusText, 128))
-                        szStatusText[0] = 0;
-                }
-                SendMessage32A (hwndStatus, SB_SETTEXT32A, 255 | SBT_NOBORDERS,
-                                (LPARAM)szStatusText);
-                SendMessage32A (hwndStatus, SB_SIMPLE, TRUE, 0);
-            }
-            break;
-
-        default:
-            WARN (commctrl, "Invalid Message!\n");
-            break;
-    }
-}
-
-
-/***********************************************************************
- * CreateToolbarEx [COMCTL32.32]
- *
- *
- *
- */
-
-HWND32 WINAPI
-CreateToolbarEx (HWND32 hwnd, DWORD style, UINT32 wID, INT32 nBitmaps,
-                 HINSTANCE32 hBMInst, UINT32 wBMID, LPCTBBUTTON lpButtons,
-                 INT32 iNumButtons, INT32 dxButton, INT32 dyButton,
-                 INT32 dxBitmap, INT32 dyBitmap, UINT32 uStructSize)
-{
-    HWND32 hwndTB =
-        CreateWindowEx32A (0, TOOLBARCLASSNAME32A, "", style, 0, 0, 0, 0,
-			   hwnd, (HMENU32)wID, 0, NULL);
-    if(hwndTB) {
-	TBADDBITMAP tbab;
-
-        SendMessage32A (hwndTB, TB_BUTTONSTRUCTSIZE,
-			(WPARAM32)uStructSize, 0);
-
-	/* set bitmap and button size */
-	if (hBMInst == HINST_COMMCTRL) {
-	    if (wBMID & 1) {
-		SendMessage32A (hwndTB, TB_SETBITMAPSIZE, 0,
-				MAKELPARAM(26, 25));
-		SendMessage32A (hwndTB, TB_SETBUTTONSIZE, 0,
-				MAKELPARAM(33, 32));
-	    }
-	    else {
-		SendMessage32A (hwndTB, TB_SETBITMAPSIZE, 0,
-				MAKELPARAM(16, 15));
-		SendMessage32A (hwndTB, TB_SETBUTTONSIZE, 0,
-				MAKELPARAM(23, 22));
-	    }
-	}
-	else {
-	    SendMessage32A (hwndTB, TB_SETBITMAPSIZE, 0,
-			    MAKELPARAM((WORD)dyBitmap, (WORD)dxBitmap));
-	    SendMessage32A (hwndTB, TB_SETBUTTONSIZE, 0,
-			    MAKELPARAM((WORD)dyButton, (WORD)dxButton));
-	}
-
-	/* add bitmaps */
-	tbab.hInst = hBMInst;
-	tbab.nID   = wBMID;
-	SendMessage32A (hwndTB, TB_ADDBITMAP,
-			(WPARAM32)nBitmaps, (LPARAM)&tbab);
-
-	/* add buttons */
-	SendMessage32A (hwndTB, TB_ADDBUTTONS32A,
-			(WPARAM32)iNumButtons, (LPARAM)lpButtons);
-    }
-
-    return hwndTB;
-}
-
-
-/***********************************************************************
- * CreateMappedBitmap [COMCTL32.8]
- *
- * PARAMS
- *     hInstance
- *     idBitmap
- *     wFlags
- *     lpColorMap
- *     iNumMaps
- */
-
-HBITMAP32 WINAPI
-CreateMappedBitmap (HINSTANCE32 hInstance, INT32 idBitmap, UINT32 wFlags,
-		    LPCOLORMAP lpColorMap, INT32 iNumMaps)
-{
-    HGLOBAL32 hglb;
-    HRSRC32 hRsrc;
-    LPBITMAPINFOHEADER lpBitmap, lpBitmapInfo;
-    UINT32 nSize, nColorTableSize;
-    DWORD *pColorTable;
-    INT32 iColor, i, iMaps, nWidth, nHeight;
-    HDC32 hdcScreen;
-    HBITMAP32 hbm;
-    LPCOLORMAP sysColorMap;
-    COLORMAP internalColorMap[4] =
-	{{0x000000, 0}, {0x808080, 0}, {0xC0C0C0, 0}, {0xFFFFFF, 0}};
-
-    /* initialize pointer to colortable and default color table */
-    if (lpColorMap) {
-	iMaps = iNumMaps;
-	sysColorMap = lpColorMap;
-    }
-    else {
-	internalColorMap[0].to = GetSysColor32 (COLOR_BTNTEXT);
-	internalColorMap[1].to = GetSysColor32 (COLOR_BTNSHADOW);
-	internalColorMap[2].to = GetSysColor32 (COLOR_BTNFACE);
-	internalColorMap[3].to = GetSysColor32 (COLOR_BTNHIGHLIGHT);
-	iMaps = 4;
-	sysColorMap = (LPCOLORMAP)internalColorMap;
-    }
-
-    hRsrc = FindResource32A (hInstance, (LPSTR)idBitmap, RT_BITMAP32A);
-    if (hRsrc == 0)
-	return 0;
-    hglb = LoadResource32 (hInstance, hRsrc);
-    if (hglb == 0)
-	return 0;
-    lpBitmap = (LPBITMAPINFOHEADER)LockResource32 (hglb);
-    if (lpBitmap == NULL)
-	return 0;
-
-    nColorTableSize = (1 << lpBitmap->biBitCount);
-    nSize = lpBitmap->biSize + nColorTableSize * sizeof(RGBQUAD);
-    lpBitmapInfo = (LPBITMAPINFOHEADER)GlobalAlloc32 (GMEM_FIXED, nSize);
-    if (lpBitmapInfo == NULL)
-	return 0;
-    RtlMoveMemory (lpBitmapInfo, lpBitmap, nSize);
-
-    pColorTable = (DWORD*)(((LPBYTE)lpBitmapInfo)+(UINT32)lpBitmapInfo->biSize);
-
-    for (iColor = 0; iColor < nColorTableSize; iColor++) {
-	for (i = 0; i < iMaps; i++) {
-	    if (pColorTable[iColor] == sysColorMap[i].from) {
-#if 0
-		if (wFlags & CBS_MASKED) {
-		    if (sysColorMap[i].to != COLOR_BTNTEXT)
-			pColorTable[iColor] = RGB(255, 255, 255);
-		}
-		else
-#endif
-		    pColorTable[iColor] = sysColorMap[i].to;
-		break;
-	    }
-	}
-    }
-
-    nWidth  = (INT32)lpBitmapInfo->biWidth;
-    nHeight = (INT32)lpBitmapInfo->biHeight;
-    hdcScreen = GetDC32 ((HWND32)0);
-    hbm = CreateCompatibleBitmap32 (hdcScreen, nWidth, nHeight);
-    if (hbm) {
-	HDC32 hdcDst = CreateCompatibleDC32 (hdcScreen);
-	HBITMAP32 hbmOld = SelectObject32 (hdcDst, hbm);
-	LPBYTE lpBits = (LPBYTE)(lpBitmap + 1);
-	lpBits += (1 << (lpBitmapInfo->biBitCount)) * sizeof(RGBQUAD);
-	StretchDIBits32 (hdcDst, 0, 0, nWidth, nHeight, 0, 0, nWidth, nHeight,
-		         lpBits, (LPBITMAPINFO)lpBitmapInfo, DIB_RGB_COLORS,
-		         SRCCOPY);
-	SelectObject32 (hdcDst, hbmOld);
-	DeleteDC32 (hdcDst);
-    }
-    ReleaseDC32 ((HWND32)0, hdcScreen);
-    GlobalFree32 ((HGLOBAL32)lpBitmapInfo);
-    FreeResource32 (hglb);
-
-    return hbm;
-}
-
-
-/***********************************************************************
- * CreateToolbar [COMCTL32.7]
- *
- *
- *
- */
-
-HWND32 WINAPI
-CreateToolbar (HWND32 hwnd, DWORD style, UINT32 wID, INT32 nBitmaps,
-	       HINSTANCE32 hBMInst, UINT32 wBMID,
-	       LPCOLDTBBUTTON lpButtons,INT32 iNumButtons)
-{
-    return CreateToolbarEx (hwnd, style | CCS_NODIVIDER, wID, nBitmaps,
-			    hBMInst, wBMID, (LPCTBBUTTON)lpButtons,
-			    iNumButtons, 0, 0, 0, 0, sizeof (OLDTBBUTTON));
-}
-
-
-/***********************************************************************
- * GetEffectiveClientRect [COMCTL32.4]
- *
- * PARAMS
- *     hwnd   [I] handle to the client window.
- *     lpRect [O] pointer to the rectangle of the client window
- *     lpInfo [I] pointer to an array of integers
- *
- * NOTES
- */
-
-VOID WINAPI
-GetEffectiveClientRect (HWND32 hwnd, LPRECT32 lpRect, LPINT32 lpInfo)
-{
-    RECT32 rcCtrl;
-    INT32  *lpRun;
-    HWND32 hwndCtrl;
-
-    TRACE (commctrl, "(0x%08lx 0x%08lx 0x%08lx)\n",
-	   (DWORD)hwnd, (DWORD)lpRect, (DWORD)lpInfo);
-
-    GetClientRect32 (hwnd, lpRect);
-    lpRun = lpInfo;
-
-    do {
-	lpRun += 2;
-	if (*lpRun == 0)
-	    return;
-	lpRun++;
-	hwndCtrl = GetDlgItem32 (hwnd, *lpRun);
-	if (GetWindowLong32A (hwndCtrl, GWL_STYLE) & WS_VISIBLE) {
-	    TRACE (commctrl, "control id 0x%x\n", *lpRun);
-	    GetWindowRect32 (hwndCtrl, &rcCtrl);
-	    MapWindowPoints32 ((HWND32)0, hwnd, (LPPOINT32)&rcCtrl, 2);
-	    SubtractRect32 (lpRect, lpRect, &rcCtrl);
-	}
-	lpRun++;
-    } while (*lpRun);
-}
-
-
-/***********************************************************************
- * ShowHideMenuCtl [COMCTL32.3] 
- *
- * Shows or hides controls and updates the corresponding menu item.
- *
- * PARAMS
- *     hwnd   [I] handle to the client window.
- *     uFlags [I] menu command id.
- *     lpInfo [I] pointer to an array of integers. (See NOTES.)
- *
- * NOTES
- *     The official documentation is incomplete! This has been fixed.
- *
- *     lpInfo
- *     The array of integers contains pairs of values. BOTH values of
- *     the first pair must be the handles to application's main menu.
- *     Each subsequent pair consists of a menu id and control id.
- */
-
-BOOL32 WINAPI
-ShowHideMenuCtl (HWND32 hwnd, UINT32 uFlags, LPINT32 lpInfo)
-{
-    LPINT32 lpMenuId;
-    FIXME (commctrl, "(0x%08x 0x%08x %p): empty stub!\n",
-	   hwnd, uFlags, lpInfo);
-
-    if (lpInfo == NULL)
-	return FALSE;
-
-    if (!(lpInfo[0]) || !(lpInfo[1]))
-	return FALSE;
-
-    /* search for control */
-    lpMenuId = &lpInfo[2];
-    while (*lpMenuId != uFlags)
-	lpMenuId += 2;
-
-    if (GetMenuState32 (lpInfo[1], uFlags, MF_BYCOMMAND) & MFS_CHECKED) {
-	/* uncheck menu item */
-	CheckMenuItem32 (lpInfo[0], *lpMenuId, MF_BYCOMMAND | MF_UNCHECKED);
-
-	/* hide control */
-	lpMenuId++;
-	SetWindowPos32 (GetDlgItem32 (hwnd, *lpMenuId), 0, 0, 0, 0, 0,
-			SWP_HIDEWINDOW);
-    }
-    else {
-	/* check menu item */
-	CheckMenuItem32 (lpInfo[0], *lpMenuId, MF_BYCOMMAND | MF_CHECKED);
-
-	/* show control */
-	lpMenuId++;
-	SetWindowPos32 (GetDlgItem32 (hwnd, *lpMenuId), 0, 0, 0, 0, 0,
-			SWP_SHOWWINDOW);
-    }
-
-    return TRUE;
-}
diff --git a/controls/edit.c b/controls/edit.c
index bfb724a..8a90e01 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -514,6 +514,7 @@
 	case EM_REPLACESEL32:
 		DPRINTF_EDIT_MSG32("EM_REPLACESEL");
 		EDIT_EM_ReplaceSel(wnd, es, (BOOL32)wParam, (LPCSTR)lParam);
+		result = 1;
 		break;
 
 	/* message 0x00c3 missing from specs */
diff --git a/controls/header.c b/controls/header.c
deleted file mode 100644
index 1e7097aa..0000000
--- a/controls/header.c
+++ /dev/null
@@ -1,1328 +0,0 @@
-/*
- *  Header control
- *
- *  Copyright 1998 Eric Kohl
- *
- *  TODO:
- *   - Imagelist support (partially).
- *   - Callback items.
- *   - Order list support.
- *   - Control specific cursors (over dividers).
- *   - Hottrack support (partially).
- *   - Custom draw support (including Notifications).
- *   - Drag and Drop support (including Notifications).
- *   - Unicode support.
- *
- *  FIXME:
- *   - Replace DrawText32A by DrawTextEx32A(...|DT_ENDELLIPSIS) in
- *     HEADER_DrawItem.
- *   - Little flaw when drawing a bitmap on the right side of the text.
- */
-
-#include "windows.h"
-#include "commctrl.h"
-#include "header.h"
-#include "heap.h"
-#include "win.h"
-#include "debug.h"
-
-
-#define __HDM_LAYOUT_HACK__
-
-
-#define VERT_BORDER     4
-#define DIVIDER_WIDTH  10
-
-#define HEADER_GetInfoPtr(wndPtr) ((HEADER_INFO *)wndPtr->wExtra[0])
-
-
-static INT32
-HEADER_DrawItem (WND *wndPtr, HDC32 hdc, INT32 iItem, BOOL32 bHotTrack)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    HEADER_ITEM *phdi = &infoPtr->items[iItem];
-    RECT32 r;
-    INT32  oldBkMode;
-
-    r = phdi->rect;
-    if (r.right - r.left == 0)
-	return phdi->rect.right;
-
-    if (wndPtr->dwStyle & HDS_BUTTONS) {
-	if (phdi->bDown) {
-	    DrawEdge32 (hdc, &r, BDR_RAISEDOUTER,
-			BF_RECT | BF_FLAT | BF_MIDDLE | BF_ADJUST);
-	    r.left += 2;
-            r.top  += 2;
-	}
-	else
-	    DrawEdge32 (hdc, &r, EDGE_RAISED,
-			BF_RECT | BF_SOFT | BF_MIDDLE | BF_ADJUST);
-    }
-    else
-        DrawEdge32 (hdc, &r, EDGE_ETCHED, BF_BOTTOM | BF_RIGHT | BF_ADJUST);
-
-    if (phdi->fmt & HDF_OWNERDRAW) {
-	DRAWITEMSTRUCT32 dis;
-	dis.CtlType    = ODT_HEADER;
-	dis.CtlID      = wndPtr->wIDmenu;
-	dis.itemID     = iItem;
-	dis.itemAction = ODA_DRAWENTIRE;
-	dis.itemState  = phdi->bDown ? ODS_SELECTED : 0;
-	dis.hwndItem   = wndPtr->hwndSelf;
-	dis.hDC        = hdc;
-	dis.rcItem     = r;
-	dis.itemData   = phdi->lParam;
-	SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_DRAWITEM,
-			(WPARAM32)wndPtr->wIDmenu, (LPARAM)&dis);
-    }
-    else {
-        UINT32 uTextJustify = DT_LEFT;
-
-        if ((phdi->fmt & HDF_JUSTIFYMASK) == HDF_CENTER)
-            uTextJustify = DT_CENTER;
-        else if ((phdi->fmt & HDF_JUSTIFYMASK) == HDF_RIGHT)
-            uTextJustify = DT_RIGHT;
-
-	if ((phdi->fmt & HDF_BITMAP) && (phdi->hbm)) {
-	    BITMAP32 bmp;
-	    HDC32    hdcBitmap;
-	    INT32    yD, yS, cx, cy, rx, ry;
-
-	    GetObject32A (phdi->hbm, sizeof(BITMAP32), (LPVOID)&bmp);
-
-	    ry = r.bottom - r.top;
-	    rx = r.right - r.left;
-
-	    if (ry >= bmp.bmHeight) {
-		cy = bmp.bmHeight;
-		yD = r.top + (ry - bmp.bmHeight) / 2;
-		yS = 0;
-	    }
-	    else {
-		cy = ry;
-		yD = r.top;
-		yS = (bmp.bmHeight - ry) / 2;
-
-	    }
-
-	    if (rx >= bmp.bmWidth + 6) {
-		cx = bmp.bmWidth;
-	    }
-	    else {
-		cx = rx - 6;
-	    }
-
-	    hdcBitmap = CreateCompatibleDC32 (hdc);
-	    SelectObject32 (hdcBitmap, phdi->hbm);
-	    BitBlt32 (hdc, r.left + 3, yD, cx, cy, hdcBitmap, 0, yS, SRCCOPY);
-	    DeleteDC32 (hdcBitmap);
-
-	    r.left += (bmp.bmWidth + 3);
-	}
-
-
-	if ((phdi->fmt & HDF_BITMAP_ON_RIGHT) && (phdi->hbm)) {
-	    BITMAP32 bmp;
-	    HDC32    hdcBitmap;
-	    INT32    xD, yD, yS, cx, cy, rx, ry, tx;
-	    RECT32   textRect;
-
-	    GetObject32A (phdi->hbm, sizeof(BITMAP32), (LPVOID)&bmp);
-
-	    textRect = r;
-            DrawText32A(hdc, phdi->pszText, lstrlen32A(phdi->pszText),
-	   	  &textRect, DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_CALCRECT);
-	    tx = textRect.right - textRect.left;
-	    ry = r.bottom - r.top;
-	    rx = r.right - r.left;
-
-	    if (ry >= bmp.bmHeight) {
-		cy = bmp.bmHeight;
-		yD = r.top + (ry - bmp.bmHeight) / 2;
-		yS = 0;
-	    }
-	    else {
-		cy = ry;
-		yD = r.top;
-		yS = (bmp.bmHeight - ry) / 2;
-
-	    }
-
-	    if (r.left + tx + bmp.bmWidth + 9 <= r.right) {
-		cx = bmp.bmWidth;
-		xD = r.left + tx + 6;
-	    }
-	    else {
-		if (rx >= bmp.bmWidth + 6) {
-		    cx = bmp.bmWidth;
-		    xD = r.right - bmp.bmWidth - 3;
-		    r.right = xD - 3;
-		}
-		else {
-		    cx = rx - 3;
-		    xD = r.left;
-		    r.right = r.left;
-		}
-	    }
-
-	    hdcBitmap = CreateCompatibleDC32 (hdc);
-	    SelectObject32 (hdcBitmap, phdi->hbm);
-	    BitBlt32 (hdc, xD, yD, cx, cy, hdcBitmap, 0, yS, SRCCOPY);
-	    DeleteDC32 (hdcBitmap);
-	}
-
-	if (phdi->fmt & HDF_IMAGE) {
-
-
-//	    ImageList_Draw (infoPtr->himl, phdi->iImage,...);
-	}
-
-        if ((phdi->fmt & HDF_STRING) && (phdi->pszText)) {
-            oldBkMode = SetBkMode32(hdc, TRANSPARENT);
-            r.left += 3;
-	    r.right -= 3;
-	    SetTextColor32 (hdc, bHotTrack ? COLOR_HIGHLIGHT : COLOR_BTNTEXT);
-            DrawText32A(hdc, phdi->pszText, lstrlen32A(phdi->pszText),
-	   	  &r, uTextJustify|DT_VCENTER|DT_SINGLELINE);
-            if (oldBkMode != TRANSPARENT)
-                SetBkMode32(hdc, oldBkMode);
-        }
-    }
-    return phdi->rect.right;
-}
-
-
-static void 
-HEADER_Refresh (WND *wndPtr, HDC32 hdc)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    HFONT32 hFont, hOldFont;
-    RECT32 rect;
-    HBRUSH32 hbrBk;
-    INT32 i, x;
-
-    /* get rect for the bar, adjusted for the border */
-    GetClientRect32 (wndPtr->hwndSelf, &rect);
-
-    hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject32 (SYSTEM_FONT);
-    hOldFont = SelectObject32 (hdc, hFont);
-
-    /* draw Background */
-    hbrBk = GetSysColorBrush32(COLOR_3DFACE);
-    FillRect32(hdc, &rect, hbrBk);
-
-    x = rect.left;
-    for (i = 0; i < infoPtr->uNumItem; i++) {
-        x = HEADER_DrawItem (wndPtr, hdc, i, FALSE);
-    }
-
-    if ((x <= rect.right) && (infoPtr->uNumItem > 0)) {
-        rect.left = x;
-        if (wndPtr->dwStyle & HDS_BUTTONS)
-            DrawEdge32 (hdc, &rect, EDGE_RAISED, BF_TOP|BF_LEFT|BF_BOTTOM|BF_SOFT);
-        else
-            DrawEdge32 (hdc, &rect, EDGE_ETCHED, BF_BOTTOM);
-    }
-
-    SelectObject32 (hdc, hOldFont);
-}
-
-
-static void
-HEADER_RefreshItem (WND *wndPtr, HDC32 hdc, INT32 iItem)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    HFONT32 hFont, hOldFont;
-
-    hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject32 (SYSTEM_FONT);
-    hOldFont = SelectObject32 (hdc, hFont);
-    HEADER_DrawItem (wndPtr, hdc, iItem, FALSE);
-    SelectObject32 (hdc, hOldFont);
-}
-
-
-static void
-HEADER_SetItemBounds (WND *wndPtr)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    HEADER_ITEM *phdi;
-    RECT32 rect;
-    int i, x;
-
-    if (infoPtr->uNumItem == 0)
-        return;
-
-    GetClientRect32 (wndPtr->hwndSelf, &rect);
-
-    x = rect.left;
-    for (i = 0; i < infoPtr->uNumItem; i++) {
-        phdi = &infoPtr->items[i];
-        phdi->rect.top = rect.top;
-        phdi->rect.bottom = rect.bottom;
-        phdi->rect.left = x;
-        phdi->rect.right = phdi->rect.left + phdi->cxy;
-        x = phdi->rect.right;
-    }
-}
-
-
-static void
-HEADER_ForceItemBounds (WND *wndPtr, INT32 cy)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    HEADER_ITEM *phdi;
-    int i, x;
-
-    if (infoPtr->uNumItem == 0)
-	return;
-
-    x = 0;
-    for (i = 0; i < infoPtr->uNumItem; i++) {
-	phdi = &infoPtr->items[i];
-	phdi->rect.top = 0;
-	phdi->rect.bottom = cy;
-	phdi->rect.left = x;
-	phdi->rect.right = phdi->rect.left + phdi->cxy;
-	x = phdi->rect.right;
-    }
-}
-
-
-static void
-HEADER_InternalHitTest (WND *wndPtr, LPPOINT32 lpPt, UINT32 *pFlags, INT32 *pItem)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    RECT32 rect, rcTest;
-    INT32  iCount, width;
-    BOOL32 bNoWidth;
-
-    GetClientRect32 (wndPtr->hwndSelf, &rect);
-
-    *pFlags = 0;
-    bNoWidth = FALSE;
-    if (PtInRect32 (&rect, *lpPt))
-    {
-	if (infoPtr->uNumItem == 0) {
-	    *pFlags |= HHT_NOWHERE;
-	    *pItem = 1;
-	    TRACE (header, "NOWHERE\n");
-	    return;
-	}
-	else {
-	    /* somewhere inside */
-	    for (iCount = 0; iCount < infoPtr->uNumItem; iCount++) {
-		rect = infoPtr->items[iCount].rect;
-		width = rect.right - rect.left;
-		if (width == 0) {
-		    bNoWidth = TRUE;
-		    continue;
-		}
-		if (PtInRect32 (&rect, *lpPt)) {
-		    if (width <= 2 * DIVIDER_WIDTH) {
-			*pFlags |= HHT_ONHEADER;
-			*pItem = iCount;
-			TRACE (header, "ON HEADER %d\n", iCount);
-			return;
-		    }
-		    if (iCount > 0) {
-			rcTest = rect;
-			rcTest.right = rcTest.left + DIVIDER_WIDTH;
-			if (PtInRect32 (&rcTest, *lpPt)) {
-			    if (bNoWidth) {
-				*pFlags |= HHT_ONDIVOPEN;
-				*pItem = iCount - 1;
-				TRACE (header, "ON DIVOPEN %d\n", *pItem);
-				return;
-			    }
-			    else {
-				*pFlags |= HHT_ONDIVIDER;
-				*pItem = iCount - 1;
-				TRACE (header, "ON DIVIDER %d\n", *pItem);
-				return;
-			    }
-			}
-		    }
-		    rcTest = rect;
-		    rcTest.left = rcTest.right - DIVIDER_WIDTH;
-		    if (PtInRect32 (&rcTest, *lpPt)) {
-			*pFlags |= HHT_ONDIVIDER;
-			*pItem = iCount;
-			TRACE (header, "ON DIVIDER %d\n", *pItem);
-			return;
-		    }
-
-		    *pFlags |= HHT_ONHEADER;
-		    *pItem = iCount;
-		    TRACE (header, "ON HEADER %d\n", iCount);
-		    return;
-		}
-	    }
-
-	    /* check for last divider part (on nowhere) */
-	    rect = infoPtr->items[infoPtr->uNumItem-1].rect;
-	    rect.left = rect.right;
-	    rect.right += DIVIDER_WIDTH;
-	    if (PtInRect32 (&rect, *lpPt)) {
-		if (bNoWidth) {
-		    *pFlags |= HHT_ONDIVOPEN;
-		    *pItem = infoPtr->uNumItem - 1;
-		    TRACE (header, "ON DIVOPEN %d\n", *pItem);
-		    return;
-		}
-		else {
-		    *pFlags |= HHT_ONDIVIDER;
-		    *pItem = infoPtr->uNumItem-1;
-		    TRACE (header, "ON DIVIDER %d\n", *pItem);
-		    return;
-		}
-	    }
-
-	    *pFlags |= HHT_NOWHERE;
-	    *pItem = 1;
-	    TRACE (header, "NOWHERE\n");
-	    return;
-	}
-    }
-    else {
-	if (lpPt->x < rect.left) {
-	   TRACE (header, "TO LEFT\n");
-	   *pFlags |= HHT_TOLEFT;
-	}
-	else if (lpPt->x > rect.right) {
-	    TRACE (header, "TO LEFT\n");
-	    *pFlags |= HHT_TORIGHT;
-	}
-
-	if (lpPt->y < rect.top) {
-	    TRACE (header, "ABOVE\n");
-	    *pFlags |= HHT_ABOVE;
-	}
-	else if (lpPt->y > rect.bottom) {
-	    TRACE (header, "BELOW\n");
-	    *pFlags |= HHT_BELOW;
-	}
-    }
-
-    *pItem = 1;
-    TRACE (header, "flags=0x%X\n", *pFlags);
-    return;
-}
-
-
-static void
-HEADER_DrawTrackLine (WND *wndPtr, HDC32 hdc, INT32 x)
-{
-    RECT32 rect;
-    HPEN32 hOldPen;
-    INT32  oldRop;
-
-    GetClientRect32 (wndPtr->hwndSelf, &rect);
-
-    hOldPen = SelectObject32 (hdc, GetStockObject32 (BLACK_PEN));
-    oldRop = SetROP232 (hdc, R2_XORPEN);
-    MoveToEx32 (hdc, x, rect.top, NULL);
-    LineTo32 (hdc, x, rect.bottom);
-    SetROP232 (hdc, oldRop);
-    SelectObject32 (hdc, hOldPen);
-}
-
-
-static BOOL32
-HEADER_SendSimpleNotify (WND *wndPtr, UINT32 code)
-{
-    NMHDR nmhdr;
-
-    nmhdr.hwndFrom = wndPtr->hwndSelf;
-    nmhdr.idFrom   = wndPtr->wIDmenu;
-    nmhdr.code     = code;
-
-    return (BOOL32)SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
-				   (WPARAM32)nmhdr.idFrom, (LPARAM)&nmhdr);
-}
-
-
-static BOOL32
-HEADER_SendHeaderNotify (WND *wndPtr, UINT32 code, INT32 iItem)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);   
-    NMHEADERA nmhdr;
-    HD_ITEMA  nmitem;
-
-    nmhdr.hdr.hwndFrom = wndPtr->hwndSelf;
-    nmhdr.hdr.idFrom = wndPtr->wIDmenu;
-    nmhdr.hdr.code = code;
-    nmhdr.iItem = iItem;
-    nmhdr.iButton = 0;
-    nmhdr.pitem = &nmitem;
-    nmitem.mask = infoPtr->items[iItem].mask;
-    nmitem.cxy = infoPtr->items[iItem].cxy;
-    nmitem.hbm = infoPtr->items[iItem].hbm;
-    nmitem.pszText = infoPtr->items[iItem].pszText;
-    nmitem.cchTextMax = infoPtr->items[iItem].cchTextMax;
-    nmitem.fmt = infoPtr->items[iItem].fmt;
-    nmitem.lParam = infoPtr->items[iItem].lParam;
-    nmitem.iOrder = infoPtr->items[iItem].iOrder;
-    nmitem.iImage = infoPtr->items[iItem].iImage;
-
-    return (BOOL32)SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
-				   (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmhdr);
-}
-
-
-static BOOL32
-HEADER_SendClickNotify (WND *wndPtr, UINT32 code, INT32 iItem)
-{
-    NMHEADERA nmhdr;
-
-    nmhdr.hdr.hwndFrom = wndPtr->hwndSelf;
-    nmhdr.hdr.idFrom = wndPtr->wIDmenu;
-    nmhdr.hdr.code = code;
-    nmhdr.iItem = iItem;
-    nmhdr.iButton = 0;
-    nmhdr.pitem = NULL;
-
-    return (BOOL32)SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
-				   (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmhdr);
-}
-
-
-static LRESULT
-HEADER_CreateDragImage (WND *wndPtr, WPARAM32 wParam)
-{
-    FIXME (header, "empty stub!\n");
-    return 0;
-}
-
-
-static LRESULT
-HEADER_DeleteItem (WND *wndPtr, WPARAM32 wParam)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    HDC32 hdc;
-    INT32 iItem;
-
-    iItem = (INT32)wParam;
-
-    TRACE(header, "[iItem=%d]\n", iItem);
-    
-    if ((iItem < 0) || (iItem > infoPtr->uNumItem - 1))
-        return FALSE;
-
-    if (infoPtr->uNumItem == 1) {
-        TRACE(header, "Simple delete!\n");
-        if (infoPtr->items[0].pszText)
-            HeapFree (GetProcessHeap (), 0, infoPtr->items[0].pszText);
-        HeapFree (GetProcessHeap (), 0, infoPtr->items);
-        infoPtr->items = 0;
-        infoPtr->uNumItem = 0;
-    }
-    else {
-        HEADER_ITEM *oldItems = infoPtr->items;
-        TRACE(header, "Complex delete! [iItem=%d]\n", iItem);
-
-        if (infoPtr->items[iItem].pszText)
-            HeapFree (GetProcessHeap (), 0, infoPtr->items[iItem].pszText);
-
-        infoPtr->uNumItem--;
-        infoPtr->items = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-                                    sizeof (HEADER_ITEM) * infoPtr->uNumItem);
-        /* pre delete copy */
-        if (iItem > 0) {
-            memcpy (&infoPtr->items[0], &oldItems[0],
-                    iItem * sizeof(HEADER_ITEM));
-        }
-
-        /* post delete copy */
-        if (iItem < infoPtr->uNumItem) {
-            memcpy (&infoPtr->items[iItem], &oldItems[iItem+1],
-                    (infoPtr->uNumItem - iItem) * sizeof(HEADER_ITEM));
-        }
-
-        HeapFree (GetProcessHeap (), 0, oldItems);
-    }
-
-    HEADER_SetItemBounds (wndPtr);
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    HEADER_Refresh (wndPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-    
-    return TRUE;
-}
-
-
-static LRESULT
-HEADER_GetImageList (WND *wndPtr)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-
-    return (LRESULT)infoPtr->himl;
-}
-
-
-static LRESULT
-HEADER_GetItem32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    HD_ITEMA *phdi;
-    INT32    iItem;
-    UINT32   uMask;
-
-    phdi = (HD_ITEMA*)lParam;
-    iItem = (INT32)wParam;
-
-    if ((iItem < 0) || (iItem > infoPtr->uNumItem - 1))
-        return FALSE;
-
-    TRACE (header, "[iItem=%d]\n", iItem);
-
-    uMask = phdi->mask;
-    if (uMask == 0)
-	return TRUE;
-    phdi->mask = 0;
-
-    if (uMask & infoPtr->items[iItem].mask & HDI_BITMAP) {
-	phdi->hbm = infoPtr->items[iItem].hbm;
-        phdi->mask |= HDI_BITMAP;
-    }
-
-    if (uMask & infoPtr->items[iItem].mask & HDI_FORMAT) {
-	phdi->fmt = infoPtr->items[iItem].fmt;
-        phdi->mask |= HDI_FORMAT;
-    }
-
-    if (uMask & infoPtr->items[iItem].mask & HDI_WIDTH) {
-	phdi->cxy = infoPtr->items[iItem].cxy;
-        phdi->mask |= HDI_WIDTH;
-    }
-
-    if (uMask & infoPtr->items[iItem].mask & HDI_LPARAM) {
-	phdi->lParam = infoPtr->items[iItem].lParam;
-        phdi->mask |= HDI_LPARAM;
-    }
-
-    if (uMask & infoPtr->items[iItem].mask & HDI_TEXT) {
-	phdi->pszText = infoPtr->items[iItem].pszText;
-	phdi->cchTextMax = infoPtr->items[iItem].cchTextMax;
-        phdi->mask |= HDI_TEXT;
-    }
-
-    if (uMask & infoPtr->items[iItem].mask & HDI_IMAGE) {
-	phdi->iImage = infoPtr->items[iItem].iImage;
-        phdi->mask |= HDI_IMAGE;
-    }
-
-    if (uMask & infoPtr->items[iItem].mask & HDI_ORDER) {
-	phdi->iOrder = infoPtr->items[iItem].iOrder;
-        phdi->mask |= HDI_ORDER;
-    }
-
-    return TRUE;
-}
-
-
-static LRESULT
-HEADER_GetItemCount (WND *wndPtr)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-
-    return (infoPtr->uNumItem);
-}
-
-
-static LRESULT
-HEADER_GetItemRect (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    INT32 iItem;
-    LPRECT32 lpRect;
-
-    iItem = (INT32)wParam;
-    lpRect = (LPRECT32)lParam;
-
-    if ((iItem < 0) || (iItem > infoPtr->uNumItem - 1))
-        return FALSE;
-
-    lpRect->left   = infoPtr->items[iItem].rect.left;
-    lpRect->right  = infoPtr->items[iItem].rect.right;
-    lpRect->top    = infoPtr->items[iItem].rect.top;
-    lpRect->bottom = infoPtr->items[iItem].rect.bottom;
-
-    return TRUE;
-}
-
-
-static LRESULT
-HEADER_HitTest (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    LPHDHITTESTINFO phti = (LPHDHITTESTINFO)lParam;
-
-    HEADER_InternalHitTest (wndPtr, &phti->pt, &phti->flags, &phti->iItem);
-
-    return phti->flags;
-}
-
-
-static LRESULT
-HEADER_InsertItem32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    HD_ITEMA *phdi;
-    HDC32    hdc;
-    INT32    iItem, len;
-
-    phdi = (HD_ITEMA*)lParam;
-    iItem = (INT32)wParam;
-    
-    if (iItem < 0) return -1;
-    if (iItem > infoPtr->uNumItem)
-        iItem = infoPtr->uNumItem;
-
-    if (infoPtr->uNumItem == 0) {
-        infoPtr->items = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-                                    sizeof (HEADER_ITEM));
-        infoPtr->uNumItem++;
-    }
-    else {
-        HEADER_ITEM *oldItems = infoPtr->items;
-
-        infoPtr->uNumItem++;
-        infoPtr->items = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-                                    sizeof (HEADER_ITEM) * infoPtr->uNumItem);
-        /* pre insert copy */
-        if (iItem > 0) {
-            memcpy (&infoPtr->items[0], &oldItems[0],
-                    iItem * sizeof(HEADER_ITEM));
-        }
-
-        /* post insert copy */
-        if (iItem < infoPtr->uNumItem - 1) {
-            memcpy (&infoPtr->items[iItem+1], &oldItems[iItem],
-                    (infoPtr->uNumItem - iItem) * sizeof(HEADER_ITEM));
-        }
-
-        HeapFree (GetProcessHeap (), 0, oldItems);
-    }
-
-    infoPtr->items[iItem].bDown = FALSE;
-
-    infoPtr->items[iItem].mask = phdi->mask;
-    if (phdi->mask & HDI_WIDTH)
-        infoPtr->items[iItem].cxy = phdi->cxy;
-
-    if (phdi->mask & HDI_TEXT) {
-        len = lstrlen32A (phdi->pszText);
-        infoPtr->items[iItem].pszText =
-            HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len+1);
-        lstrcpy32A (infoPtr->items[iItem].pszText, phdi->pszText);
-        infoPtr->items[iItem].cchTextMax = phdi->cchTextMax;
-    }
-
-    if (phdi->mask & HDI_FORMAT)
-        infoPtr->items[iItem].fmt = phdi->fmt;
-
-    if (phdi->mask & HDI_BITMAP)
-        infoPtr->items[iItem].hbm = phdi->hbm;
-
-    if (phdi->mask & HDI_LPARAM)
-        infoPtr->items[iItem].lParam = phdi->lParam;
-
-    if (phdi->mask & HDI_IMAGE)
-        infoPtr->items[iItem].iImage = phdi->iImage;
-
-    if (phdi->mask & HDI_ORDER)
-        infoPtr->items[iItem].iOrder = phdi->iOrder;
-
-    HEADER_SetItemBounds (wndPtr);
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    HEADER_Refresh (wndPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return iItem;
-}
-
-
-static LRESULT
-HEADER_Layout (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    LPHDLAYOUT lpLayout = (LPHDLAYOUT)lParam;
-
-    lpLayout->pwpos->hwnd = wndPtr->hwndSelf;
-    lpLayout->pwpos->hwndInsertAfter = 0;
-    lpLayout->pwpos->x = lpLayout->prc->left;
-    lpLayout->pwpos->y = lpLayout->prc->top;
-    lpLayout->pwpos->cx = lpLayout->prc->right - lpLayout->prc->left;
-    if (wndPtr->dwStyle & HDS_HIDDEN)
-        lpLayout->pwpos->cy = 0;
-    else
-        lpLayout->pwpos->cy = infoPtr->nHeight;
-    lpLayout->pwpos->flags = SWP_NOZORDER;
-
-    TRACE (header, "Layout x=%d y=%d cx=%d cy=%d\n",
-           lpLayout->pwpos->x, lpLayout->pwpos->y,
-           lpLayout->pwpos->cx, lpLayout->pwpos->cy);
-
-    HEADER_ForceItemBounds (wndPtr, lpLayout->pwpos->cy);
-
-    /* hack */
-#ifdef __HDM_LAYOUT_HACK__
-    MoveWindow32 (lpLayout->pwpos->hwnd, lpLayout->pwpos->x, lpLayout->pwpos->y,
-                  lpLayout->pwpos->cx, lpLayout->pwpos->cy, TRUE);
-#endif
-
-    return TRUE;
-}
-
-
-static LRESULT
-HEADER_SetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    HIMAGELIST himlOld;
-
-    himlOld = infoPtr->himl;
-    infoPtr->himl = (HIMAGELIST)lParam;
-
-    /* FIXME: Refresh needed??? */
-
-    return (LRESULT)himlOld;
-}
-
-
-static LRESULT
-HEADER_SetItem32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    HD_ITEMA *phdi;
-    INT32    iItem;
-    HDC32    hdc;
-
-    phdi = (HD_ITEMA*)lParam;
-    iItem = (INT32)wParam;
-
-    if ((iItem < 0) || (iItem > infoPtr->uNumItem - 1))
-        return FALSE;
-
-    TRACE (header, "[iItem=%d]\n", iItem);
-
-    if (HEADER_SendHeaderNotify (wndPtr, HDN_ITEMCHANGING32A, iItem))
-	return FALSE;
-
-    if (phdi->mask & HDI_BITMAP) {
-	infoPtr->items[iItem].hbm = phdi->hbm;
-	infoPtr->items[iItem].mask  |= HDI_BITMAP;
-    }
-
-    if (phdi->mask & HDI_FORMAT) {
-	infoPtr->items[iItem].fmt = phdi->fmt;
-	infoPtr->items[iItem].mask  |= HDI_FORMAT;
-    }
-
-    if (phdi->mask & HDI_LPARAM) {
-	infoPtr->items[iItem].lParam = phdi->lParam;
-	infoPtr->items[iItem].mask  |= HDI_LPARAM;
-    }
-
-    if (phdi->mask & HDI_TEXT) {
-        INT32 len = lstrlen32A (phdi->pszText);
-        if (infoPtr->items[iItem].pszText)
-	    HeapFree (GetProcessHeap (), 0, infoPtr->items[iItem].pszText);
-        infoPtr->items[iItem].pszText =
-            HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len+1);
-        lstrcpy32A (infoPtr->items[iItem].pszText, phdi->pszText);
-        infoPtr->items[iItem].cchTextMax = phdi->cchTextMax;
-    }
-
-    if (phdi->mask & HDI_WIDTH) {
-	infoPtr->items[iItem].cxy = phdi->cxy;
-	infoPtr->items[iItem].mask  |= HDI_WIDTH;
-    }
-
-    if (phdi->mask & HDI_IMAGE) {
-	infoPtr->items[iItem].iImage = phdi->iImage;
-	infoPtr->items[iItem].mask  |= HDI_IMAGE;
-    }
-
-    if (phdi->mask & HDI_ORDER) {
-	infoPtr->items[iItem].iOrder = phdi->iOrder;
-	infoPtr->items[iItem].mask  |= HDI_ORDER;
-    }
-
-    HEADER_SendHeaderNotify (wndPtr, HDN_ITEMCHANGED32A, iItem);
-
-    HEADER_SetItemBounds (wndPtr);
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    HEADER_Refresh (wndPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return TRUE;
-}
-
-
-static LRESULT
-HEADER_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HEADER_INFO *infoPtr;
-    TEXTMETRIC32A tm;
-    HFONT32 hOldFont;
-    HDC32   hdc;
-
-    infoPtr = (HEADER_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-                                        sizeof(HEADER_INFO));
-    wndPtr->wExtra[0] = (DWORD)infoPtr;
-
-    infoPtr->uNumItem = 0;
-    infoPtr->nHeight = 20;
-    infoPtr->hFont = 0;
-    infoPtr->items = 0;
-    infoPtr->hcurArrow = LoadCursor32A (0, IDC_ARROW32A);
-    infoPtr->hcurDivider = LoadCursor32A (0, IDC_SIZEWE32A);
-    infoPtr->hcurDivopen = LoadCursor32A (0, IDC_SIZENS32A);
-    infoPtr->bPressed  = FALSE;
-    infoPtr->bTracking = FALSE;
-    infoPtr->iMoveItem = 0;
-    infoPtr->himl = 0;
-    infoPtr->iHotItem = -1;
-
-    hdc = GetDC32 (0);
-    hOldFont = SelectObject32 (hdc, GetStockObject32 (SYSTEM_FONT));
-    GetTextMetrics32A (hdc, &tm);
-    infoPtr->nHeight = tm.tmHeight + VERT_BORDER;
-    SelectObject32 (hdc, hOldFont);
-    ReleaseDC32 (0, hdc);
-
-    return 0;
-}
-
-
-static LRESULT
-HEADER_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    INT32 iItem;
-
-    if (infoPtr->items) {
-        for (iItem = 0; iItem < infoPtr->uNumItem; iItem++) {
-            if (infoPtr->items[iItem].pszText)
-                HeapFree (GetProcessHeap (), 0, infoPtr->items[iItem].pszText);
-        }
-        HeapFree (GetProcessHeap (), 0, infoPtr->items);
-    }
-
-    if (infoPtr->himl)
-	ImageList_Destroy (infoPtr->himl);
-
-    HeapFree (GetProcessHeap (), 0, infoPtr);
-
-    return 0;
-}
-
-
-static LRESULT
-HEADER_GetFont (WND *wndPtr)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-
-    return (LRESULT)infoPtr->hFont;
-}
-
-
-static LRESULT
-HEADER_LButtonDblClk (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    POINT32 pt;
-    UINT32  flags;
-    INT32   iItem;
-
-    pt.x = (INT32)LOWORD(lParam); 
-    pt.y = (INT32)HIWORD(lParam);
-    HEADER_InternalHitTest (wndPtr, &pt, &flags, &iItem);
-
-    if ((wndPtr->dwStyle & HDS_BUTTONS) && (flags == HHT_ONHEADER))
-	HEADER_SendHeaderNotify (wndPtr, HDN_ITEMDBLCLICK32A, iItem);
-    else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN))
-	HEADER_SendHeaderNotify (wndPtr, HDN_DIVIDERDBLCLICK32A, iItem);
-
-    return 0;
-}
-
-
-static LRESULT
-HEADER_LButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    POINT32 pt;
-    UINT32  flags;
-    INT32   iItem;
-    HDC32   hdc;
-
-    pt.x = (INT32)LOWORD(lParam); 
-    pt.y = (INT32)HIWORD(lParam);
-    HEADER_InternalHitTest (wndPtr, &pt, &flags, &iItem);
-
-    if ((wndPtr->dwStyle & HDS_BUTTONS) && (flags == HHT_ONHEADER)) {
-	SetCapture32 (wndPtr->hwndSelf);
-	infoPtr->bCaptured = TRUE;   
-	infoPtr->bPressed  = TRUE;
-	infoPtr->iMoveItem = iItem;
-
-	infoPtr->items[iItem].bDown = TRUE;
-
-	/* Send WM_CUSTOMDRAW */
-	hdc = GetDC32 (wndPtr->hwndSelf);
-	HEADER_RefreshItem (wndPtr, hdc, iItem);
-	ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-	TRACE (header, "Pressed item %d!\n", iItem);
-    } 
-    else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN)) {
-	if (!(HEADER_SendHeaderNotify (wndPtr, HDN_BEGINTRACK32A, iItem))) {
-	    SetCapture32 (wndPtr->hwndSelf);
-	    infoPtr->bCaptured = TRUE;   
-	    infoPtr->bTracking = TRUE;
-	    infoPtr->iMoveItem = iItem;
-	    infoPtr->nOldWidth = infoPtr->items[iItem].cxy;
-	    infoPtr->xTrackOffset = infoPtr->items[iItem].rect.right - pt.x;
-
-	    if (!(wndPtr->dwStyle & HDS_FULLDRAG)) {
-		infoPtr->xOldTrack = infoPtr->items[iItem].rect.right;
-		hdc = GetDC32 (wndPtr->hwndSelf);
-		HEADER_DrawTrackLine (wndPtr, hdc, infoPtr->xOldTrack);
-		ReleaseDC32 (wndPtr->hwndSelf, hdc);
-	    }
-
-	    TRACE (header, "Begin tracking item %d!\n", iItem);
-	}
-    }
-
-    return 0;
-}
-
-
-static LRESULT
-HEADER_LButtonUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    POINT32 pt;
-    UINT32  flags;
-    INT32   iItem, nWidth;
-    HDC32   hdc;
-
-    pt.x = (INT32)LOWORD(lParam);
-    pt.y = (INT32)HIWORD(lParam);
-    HEADER_InternalHitTest (wndPtr, &pt, &flags, &iItem);
-
-    if (infoPtr->bPressed) {
-	if ((iItem == infoPtr->iMoveItem) && (flags == HHT_ONHEADER)) {
-	    infoPtr->items[infoPtr->iMoveItem].bDown = FALSE;
-	    hdc = GetDC32 (wndPtr->hwndSelf);
-	    HEADER_RefreshItem (wndPtr, hdc, infoPtr->iMoveItem);
-	    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-	    HEADER_SendClickNotify (wndPtr, HDN_ITEMCLICK32A, infoPtr->iMoveItem);
-	}
-	TRACE (header, "Released item %d!\n", infoPtr->iMoveItem);
-	infoPtr->bPressed = FALSE;
-    }
-    else if (infoPtr->bTracking) {
-	TRACE (header, "End tracking item %d!\n", infoPtr->iMoveItem);
-	infoPtr->bTracking = FALSE;
-
-	HEADER_SendHeaderNotify (wndPtr, HDN_ENDTRACK32A, infoPtr->iMoveItem);
-
-	if (!(wndPtr->dwStyle & HDS_FULLDRAG)) {
-	    hdc = GetDC32 (wndPtr->hwndSelf);
-	    HEADER_DrawTrackLine (wndPtr, hdc, infoPtr->xOldTrack);
-	    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-	    if (HEADER_SendHeaderNotify (wndPtr, HDN_ITEMCHANGING32A, infoPtr->iMoveItem))
-		infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth;
-	    else {
-		nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left +
-		infoPtr->xTrackOffset;
-		if (nWidth < 0)
-		    nWidth = 0;
-		infoPtr->items[infoPtr->iMoveItem].cxy = nWidth;
-		HEADER_SendHeaderNotify (wndPtr, HDN_ITEMCHANGED32A, infoPtr->iMoveItem);
-	    }
-
-	    HEADER_SetItemBounds (wndPtr);
-	    hdc = GetDC32 (wndPtr->hwndSelf);
-	    HEADER_Refresh (wndPtr, hdc);
-	    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-	}
-    }
-
-    if (infoPtr->bCaptured) {
-	infoPtr->bCaptured = FALSE;
-	ReleaseCapture ();
-	HEADER_SendSimpleNotify (wndPtr, NM_RELEASEDCAPTURE);
-    }
-
-    return 0;
-}
-
-
-static LRESULT
-HEADER_MouseMove (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    POINT32 pt;
-    UINT32  flags;
-    INT32   iItem, nWidth;
-    HDC32   hdc;
-
-    pt.x = (INT32)LOWORD(lParam);
-    pt.y = (INT32)HIWORD(lParam);
-    HEADER_InternalHitTest (wndPtr, &pt, &flags, &iItem);
-
-    if ((wndPtr->dwStyle & HDS_BUTTONS) && (wndPtr->dwStyle & HDS_HOTTRACK)) {
-	if (flags & (HHT_ONHEADER | HHT_ONDIVIDER | HHT_ONDIVOPEN))
-	    infoPtr->iHotItem = iItem;
-	else
-	    infoPtr->iHotItem = -1;
-	hdc = GetDC32 (wndPtr->hwndSelf);
-	HEADER_Refresh (wndPtr, hdc);
-	ReleaseDC32 (wndPtr->hwndSelf, hdc);
-    }
-
-    if (infoPtr->bCaptured) {
-	if (infoPtr->bPressed) {
-	    if ((iItem == infoPtr->iMoveItem) && (flags == HHT_ONHEADER))
-		infoPtr->items[infoPtr->iMoveItem].bDown = TRUE;
-	    else
-		infoPtr->items[infoPtr->iMoveItem].bDown = FALSE;
-	    hdc = GetDC32 (wndPtr->hwndSelf);
-	    HEADER_RefreshItem (wndPtr, hdc, infoPtr->iMoveItem);
-	    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-	    TRACE (header, "Moving pressed item %d!\n", infoPtr->iMoveItem);
-	}
-	else if (infoPtr->bTracking) {
-	    if (wndPtr->dwStyle & HDS_FULLDRAG) {
-		if (HEADER_SendHeaderNotify (wndPtr, HDN_ITEMCHANGING32A, infoPtr->iMoveItem))
-		    infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth;
-		else {
-		    nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left +
-		    infoPtr->xTrackOffset;
-		    if (nWidth < 0)
-			nWidth = 0;
-		    infoPtr->items[infoPtr->iMoveItem].cxy = nWidth;
-		    HEADER_SendHeaderNotify (wndPtr, HDN_ITEMCHANGED32A,
-					     infoPtr->iMoveItem);
-		}
-		HEADER_SetItemBounds (wndPtr);
-		hdc = GetDC32 (wndPtr->hwndSelf);
-		HEADER_Refresh (wndPtr, hdc);
-		ReleaseDC32 (wndPtr->hwndSelf, hdc);
-	    }
-	    else {
-		hdc = GetDC32 (wndPtr->hwndSelf);
-		HEADER_DrawTrackLine (wndPtr, hdc, infoPtr->xOldTrack);
-		infoPtr->xOldTrack = pt.x + infoPtr->xTrackOffset;
-		if (infoPtr->xOldTrack < infoPtr->items[infoPtr->iMoveItem].rect.left)
-		    infoPtr->xOldTrack = infoPtr->items[infoPtr->iMoveItem].rect.left;
-		infoPtr->items[infoPtr->iMoveItem].cxy = 
-		    infoPtr->xOldTrack - infoPtr->items[infoPtr->iMoveItem].rect.left;
-		HEADER_DrawTrackLine (wndPtr, hdc, infoPtr->xOldTrack);
-		ReleaseDC32 (wndPtr->hwndSelf, hdc);
-	    }
-
-	    HEADER_SendHeaderNotify (wndPtr, HDN_TRACK32A, infoPtr->iMoveItem);
-	    TRACE (header, "Tracking item %d!\n", infoPtr->iMoveItem);
-	}
-    }
-
-    if ((wndPtr->dwStyle & HDS_BUTTONS) && (wndPtr->dwStyle & HDS_HOTTRACK)) {
-	FIXME (header, "hot track support!\n");
-    }
-
-    return 0;
-}
-
-
-static LRESULT
-HEADER_Paint (WND *wndPtr, WPARAM32 wParam)
-{
-    HDC32 hdc;
-    PAINTSTRUCT32 ps;
-
-    hdc = wParam==0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
-    HEADER_Refresh (wndPtr, hdc);
-    if(!wParam)
-	EndPaint32 (wndPtr->hwndSelf, &ps);
-    return 0;
-}
-
-
-static LRESULT
-HEADER_RButtonUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    return HEADER_SendSimpleNotify (wndPtr, NM_RCLICK);
-}
-
-
-static LRESULT
-HEADER_SetCursor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    POINT32 pt;
-    UINT32  flags;
-    INT32   iItem;
-
-    TRACE (header, "code=0x%X  id=0x%X\n", LOWORD(lParam), HIWORD(lParam));
-
-    GetCursorPos32 (&pt);
-    ScreenToClient32 (wndPtr->hwndSelf, &pt);
-
-    HEADER_InternalHitTest (wndPtr, &pt, &flags, &iItem);
-
-    if (flags == HHT_ONDIVIDER)
-        SetCursor32 (infoPtr->hcurDivider);
-    else if (flags == HHT_ONDIVOPEN)
-        SetCursor32 (infoPtr->hcurDivopen);
-    else
-        SetCursor32 (infoPtr->hcurArrow);
-
-    return 0;
-}
-
-
-static LRESULT
-HEADER_SetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    TEXTMETRIC32A tm;
-    HFONT32 hFont, hOldFont;
-    HDC32 hdc;
-
-    infoPtr->hFont = (HFONT32)wParam;
-
-    hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject32 (SYSTEM_FONT);
-
-    hdc = GetDC32 (0);
-    hOldFont = SelectObject32 (hdc, hFont);
-    GetTextMetrics32A (hdc, &tm);
-    infoPtr->nHeight = tm.tmHeight + VERT_BORDER;
-    SelectObject32 (hdc, hOldFont);
-    ReleaseDC32 (0, hdc);
-
-    if (lParam) {
-        HEADER_ForceItemBounds (wndPtr, infoPtr->nHeight);
-        hdc = GetDC32 (wndPtr->hwndSelf);
-        HEADER_Refresh (wndPtr, hdc);
-        ReleaseDC32 (wndPtr->hwndSelf, hdc);
-    }
-
-    return 0;
-}
-
-
-LRESULT WINAPI
-HeaderWindowProc (HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
-{
-    WND *wndPtr = WIN_FindWndPtr(hwnd);
-
-    switch (msg) {
-	case HDM_CREATEDRAGIMAGE:
-	    return HEADER_CreateDragImage (wndPtr, wParam);
-
-	case HDM_DELETEITEM:
-	    return HEADER_DeleteItem (wndPtr, wParam);
-
-	case HDM_GETIMAGELIST:
-	    return HEADER_GetImageList (wndPtr);
-
-	case HDM_GETITEM32A:
-	    return HEADER_GetItem32A (wndPtr, wParam, lParam);
-
-	case HDM_GETITEMCOUNT:
-	    return HEADER_GetItemCount (wndPtr);
-
-	case HDM_GETITEMRECT:
-	    return HEADER_GetItemRect (wndPtr, wParam, lParam);
-
-	case HDM_HITTEST:
-	    return HEADER_HitTest (wndPtr, wParam, lParam);
-
-	case HDM_INSERTITEM32A:
-	    return HEADER_InsertItem32A (wndPtr, wParam, lParam);
-
-	case HDM_LAYOUT:
-	    return HEADER_Layout (wndPtr, wParam, lParam);
-
-	case HDM_SETIMAGELIST:
-	    return HEADER_SetImageList (wndPtr, wParam, lParam);
-
-	case HDM_SETITEM32A:
-	    return HEADER_SetItem32A (wndPtr, wParam, lParam);
-
-
-        case WM_CREATE:
-            return HEADER_Create (wndPtr, wParam, lParam);
-
-        case WM_DESTROY:
-            return HEADER_Destroy (wndPtr, wParam, lParam);
-
-        case WM_ERASEBKGND:
-            return 1;
-
-        case WM_GETDLGCODE:
-            return DLGC_WANTTAB | DLGC_WANTARROWS;
-
-        case WM_GETFONT:
-            return HEADER_GetFont (wndPtr);
-
-        case WM_LBUTTONDBLCLK:
-            return HEADER_LButtonDblClk (wndPtr, wParam, lParam);
-
-        case WM_LBUTTONDOWN:
-            return HEADER_LButtonDown (wndPtr, wParam, lParam);
-
-        case WM_LBUTTONUP:
-            return HEADER_LButtonUp (wndPtr, wParam, lParam);
-
-        case WM_MOUSEMOVE:
-            return HEADER_MouseMove (wndPtr, wParam, lParam);
-
-        case WM_PAINT:
-            return HEADER_Paint (wndPtr, wParam);
-
-        case WM_RBUTTONUP:
-            return HEADER_RButtonUp (wndPtr, wParam, lParam);
-
-        case WM_SETCURSOR:
-            return HEADER_SetCursor (wndPtr, wParam, lParam);
-
-        case WM_SETFONT:
-            return HEADER_SetFont (wndPtr, wParam, lParam);
-
-        default:
-            if (msg >= WM_USER) 
-		ERR (header, "unknown msg %04x wp=%04x lp=%08lx\n",
-		     msg, wParam, lParam );
-	    return DefWindowProc32A (hwnd, msg, wParam, lParam);
-    }
-    return 0;
-}
-
-
-void HEADER_Register( void )
-{
-    WNDCLASS32A wndClass;
-
-    if (GlobalFindAtom32A (WC_HEADER32A)) return;
-
-    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
-    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS;
-    wndClass.lpfnWndProc   = (WNDPROC32)HeaderWindowProc;
-    wndClass.cbClsExtra    = 0;
-    wndClass.cbWndExtra    = sizeof(HEADER_INFO *);
-    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
-    wndClass.lpszClassName = WC_HEADER32A;
- 
-    RegisterClass32A (&wndClass);
-}
-
diff --git a/controls/listbox.c b/controls/listbox.c
index 25af765..9571034 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -312,7 +312,7 @@
     GetClientRect32( wnd->hwndSelf, &rect );
     descr->width  = rect.right - rect.left;
     descr->height = rect.bottom - rect.top;
-    if (!(descr->style & LBS_NOINTEGRALHEIGHT))
+    if (!(descr->style & LBS_NOINTEGRALHEIGHT) && !IS_OWNERDRAW(descr))
     {
         if ((descr->height > descr->item_height) &&
             (descr->height % descr->item_height))
diff --git a/controls/listview.c b/controls/listview.c
deleted file mode 100644
index 1c600c5..0000000
--- a/controls/listview.c
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Listview control
- *
- * Copyright 1998 Eric Kohl
- *
- * NOTES
- *   This is just a dummy control. An author is needed! Any volunteers?
- *   I will only improve this control once in a while.
- *     Eric <ekohl@abo.rhein-zeitung.de>
- *
- * TODO:
- *   - All messages.
- *   - All notifications.
- */
-
-#include "windows.h"
-#include "commctrl.h"
-#include "listview.h"
-#include "heap.h"
-#include "win.h"
-#include "debug.h"
-
-
-#define LISTVIEW_GetInfoPtr(wndPtr) ((LISTVIEW_INFO *)wndPtr->wExtra[0])
-
-
-static VOID
-LISTVIEW_Refresh (WND *wndPtr, HDC32 hdc)
-{
-    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
-
-
-
-}
-
-
-
-static LRESULT
-LISTVIEW_SetBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
-
-    if (!(infoPtr)) return FALSE;
-
-    /* set background color */
-    infoPtr->clrBk = (COLORREF)lParam;
-
-    return TRUE;
-}
-
-
-static LRESULT
-LISTVIEW_SetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
-
-    FIXME (listview, "(0x%08x 0x%08lx)\n", wParam, lParam);
-
-    return 0;
-}
-
-
-static LRESULT
-LISTVIEW_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
-
-    /* initialize info structure */
-    infoPtr->clrBk = CLR_NONE;
-
-    return 0;
-}
-
-
-static LRESULT
-LISTVIEW_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
-
-
-    return 0;
-}
-
-
-static LRESULT
-LISTVIEW_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
-
-    if (infoPtr->clrBk == CLR_NONE) {
-	return SendMessage32A (GetParent32 (wndPtr->hwndSelf),
-			       WM_ERASEBKGND, wParam, lParam);
-    }
-    else {
-	RECT32 rect;
-	HBRUSH32 hBrush = CreateSolidBrush32 (infoPtr->clrBk);
-	GetClientRect32 (wndPtr->hwndSelf, &rect);
-	FillRect32 ((HDC32)wParam, &rect, hBrush);
-	DeleteObject32 (hBrush);
-	return FALSE;
-    }
-    return FALSE;
-}
-
-
-static LRESULT
-LISTVIEW_NCCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    LISTVIEW_INFO *infoPtr;
-
-    /* allocate memory for info structure */
-    infoPtr = (LISTVIEW_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-                                   sizeof(LISTVIEW_INFO));
-    wndPtr->wExtra[0] = (DWORD)infoPtr;
-
-    if (infoPtr == NULL) {
-	ERR (listview, "could not allocate info memory!\n");
-	return 0;
-    }
-
-    if ((LISTVIEW_INFO*)wndPtr->wExtra[0] != infoPtr) {
-	ERR (listview, "pointer assignment error!\n");
-	return 0;
-    }
-
-    return DefWindowProc32A (wndPtr->hwndSelf, WM_NCCREATE, wParam, lParam);
-}
-
-
-static LRESULT
-LISTVIEW_NCDestroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
-
-
-
-
-    /* free list view info data */
-    HeapFree (GetProcessHeap (), 0, infoPtr);
-
-    return 0;
-}
-
-
-static LRESULT
-LISTVIEW_Paint (WND *wndPtr, WPARAM32 wParam)
-{
-    HDC32 hdc;
-    PAINTSTRUCT32 ps;
-
-    hdc = wParam==0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
-    LISTVIEW_Refresh (wndPtr, hdc);
-    if (!wParam)
-	EndPaint32 (wndPtr->hwndSelf, &ps);
-    return 0;
-}
-
-
-LRESULT WINAPI
-ListviewWindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
-{
-    WND *wndPtr = WIN_FindWndPtr(hwnd);
-
-    switch (uMsg)
-    {
-
-	case LVM_SETBKCOLOR:
-	    return LISTVIEW_SetBkColor (wndPtr, wParam, lParam);
-
-	
-	case LVM_SETIMAGELIST:
-	    return LISTVIEW_SetImageList (wndPtr, wParam, lParam);
-
-
-
-
-//	case WM_CHAR:
-//	case WM_COMMAND:
-
-	case WM_CREATE:
-	    return LISTVIEW_Create (wndPtr, wParam, lParam);
-
-	case WM_DESTROY:
-	    return LISTVIEW_Destroy (wndPtr, wParam, lParam);
-
-	case WM_ERASEBKGND:
-	    return LISTVIEW_EraseBackground (wndPtr, wParam, lParam);
-
-//	case WM_GETDLGCODE:
-//	case WM_GETFONT:
-//	case WM_HSCROLL:
-
-//	case WM_MOUSEMOVE:
-//	    return LISTVIEW_MouseMove (wndPtr, wParam, lParam);
-
-	case WM_NCCREATE:
-	    return LISTVIEW_NCCreate (wndPtr, wParam, lParam);
-
-	case WM_NCDESTROY:
-	    return LISTVIEW_NCDestroy (wndPtr, wParam, lParam);
-
-//	case WM_NOTIFY:
-
-	case WM_PAINT:
-	    return LISTVIEW_Paint (wndPtr, wParam);
-
-//	case WM_RBUTTONDOWN:
-//	case WM_SETFOCUS:
-//	case WM_SETFONT:
-//	case WM_SETREDRAW:
-//	case WM_TIMER:
-//	case WM_VSCROLL:
-//	case WM_WINDOWPOSCHANGED:
-//	case WM_WININICHANGE:
-
-	default:
-	    if (uMsg >= WM_USER)
-		ERR (listview, "unknown msg %04x wp=%08x lp=%08lx\n",
-		     uMsg, wParam, lParam);
-	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
-    }
-    return 0;
-}
-
-
-void
-LISTVIEW_Register (void)
-{
-    WNDCLASS32A wndClass;
-
-    if (GlobalFindAtom32A (WC_LISTVIEW32A)) return;
-
-    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
-    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS;
-    wndClass.lpfnWndProc   = (WNDPROC32)ListviewWindowProc;
-    wndClass.cbClsExtra    = 0;
-    wndClass.cbWndExtra    = sizeof(LISTVIEW_INFO *);
-    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
-    wndClass.hbrBackground = (HBRUSH32)(COLOR_WINDOW + 1);
-    wndClass.lpszClassName = WC_LISTVIEW32A;
- 
-    RegisterClass32A (&wndClass);
-}
-
diff --git a/controls/menu.c b/controls/menu.c
index 45a25c6..8940964 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -760,7 +760,7 @@
 
     if ((lprect == NULL) || (lppop == NULL)) return;
     if (lppop->nItems == 0) return;
-    TRACE(menu,"MENU_MenuBarCalcSize left=%d top=%d right=%d bottom=%d\n", 
+    TRACE(menu,"left=%d top=%d right=%d bottom=%d\n", 
                  lprect->left, lprect->top, lprect->right, lprect->bottom);
     lppop->Width  = lprect->right - lprect->left;
     lppop->Height = 0;
@@ -1102,7 +1102,7 @@
 		SetROP232( hdc, ropPrev );
 	    }
 	    else
-		TWEAK_DrawReliefRect95(hdc, &rect);
+		DrawEdge32 (hdc, &rect, EDGE_RAISED, BF_RECT);
 
 	    /* draw menu items */
 
@@ -2968,6 +2968,7 @@
 
     if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return -1;
     if ((nPos < 0) || (nPos >= menu->nItems)) return -1;
+    if (menu->items[nPos].fType & MF_POPUP) return -1; 
     return menu->items[nPos].wID;
 }
 
@@ -3814,8 +3815,21 @@
     if (lpmii->fMask & MIIM_ID)
 	menu->wID = lpmii->wID;
 
-    if (lpmii->fMask & MIIM_SUBMENU)
+    if (lpmii->fMask & MIIM_SUBMENU) {
 	menu->hSubMenu = lpmii->hSubMenu;
+	if (menu->hSubMenu) {
+	    POPUPMENU *subMenu = (POPUPMENU *)USER_HEAP_LIN_ADDR((UINT16)menu->hSubMenu);
+	    if (IS_A_MENU(subMenu)) {
+		subMenu->wFlags |= MF_POPUP;
+		menu->fType |= MF_POPUP;
+	    }
+	    else
+		/* FIXME: Return an error ? */
+		menu->fType &= ~MF_POPUP;
+	}
+	else
+	    menu->fType &= ~MF_POPUP;
+    }
 
     if (lpmii->fMask & MIIM_CHECKMARKS)
     {
diff --git a/controls/pager.c b/controls/pager.c
deleted file mode 100644
index 60612c2..0000000
--- a/controls/pager.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Pager control
- *
- * Copyright 1998 Eric Kohl
- *
- * NOTES
- *   This is just a dummy control. An author is needed! Any volunteers?
- *   I will only improve this control once in a while.
- *     Eric <ekohl@abo.rhein-zeitung.de>
- *
- * TODO:
- *   - All messages.
- *   - All notifications.
- */
-
-#include "windows.h"
-#include "commctrl.h"
-#include "pager.h"
-#include "heap.h"
-#include "win.h"
-#include "debug.h"
-
-
-#define PAGER_GetInfoPtr(wndPtr) ((PAGER_INFO *)wndPtr->wExtra[0])
-
-
-static __inline__ LRESULT
-PAGER_ForwardMouse (WND *wndPtr, WPARAM32 wParam)
-{
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-
-    infoPtr->bForward = (BOOL32)wParam;
-
-    return 0;
-}
-
-
-static __inline__ LRESULT
-PAGER_GetBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-
-    return (LRESULT)infoPtr->clrBk;
-}
-
-
-static __inline__ LRESULT
-PAGER_GetBorder (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-
-    return (LRESULT)infoPtr->iBorder;
-}
-
-
-static __inline__ LRESULT
-PAGER_GetButtonSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-
-    return (LRESULT)infoPtr->iButtonSize;
-}
-
-
-// << PAGER_GetButtonState >>
-// << PAGER_GetDropTarget >>
-
-
-static __inline__ LRESULT
-PAGER_GetPos (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-
-    return infoPtr->iPos;
-}
-
-
-static LRESULT
-PAGER_RecalcSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-//    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-
-    FIXME (pager, "empty stub!\n");
-
-    return 0;
-}
-
-
-static __inline__ LRESULT
-PAGER_SetBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-    COLORREF clrTemp = infoPtr->clrBk;
-
-    infoPtr->clrBk = (COLORREF)lParam;
-
-    /* FIXME: redraw */
-
-    return (LRESULT)clrTemp;
-}
-
-
-static __inline__ LRESULT
-PAGER_SetBorder (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-    INT32 nTemp = infoPtr->iBorder;
-
-    infoPtr->iBorder = (INT32)lParam;
-
-    /* FIXME: redraw */
-
-    return (LRESULT)nTemp;
-}
-
-
-static __inline__ LRESULT
-PAGER_SetButtonSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-    INT32 nTemp = infoPtr->iButtonSize;
-
-    infoPtr->iButtonSize = (INT32)lParam;
-
-    /* FIXME: redraw */
-
-    return (LRESULT)nTemp;
-}
-
-
-static __inline__ LRESULT
-PAGER_SetChild (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-
-    infoPtr->hwndChild = (HWND32)lParam;
-
-    /* FIXME: redraw */
-
-    return 0;
-}
-
-
-static __inline__ LRESULT
-PAGER_SetPos (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-
-    infoPtr->iPos = (INT32)lParam;
-
-    /* FIXME: redraw */
-
-    return 0;
-}
-
-
-static LRESULT
-PAGER_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    PAGER_INFO *infoPtr;
-
-    /* allocate memory for info structure */
-    infoPtr = (PAGER_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-                                   sizeof(PAGER_INFO));
-    wndPtr->wExtra[0] = (DWORD)infoPtr;
-
-    if (infoPtr == NULL) {
-	ERR (pager, "could not allocate info memory!\n");
-	return 0;
-    }
-
-    if ((PAGER_INFO*)wndPtr->wExtra[0] != infoPtr) {
-	ERR (pager, "pointer assignment error!\n");
-	return 0;
-    }
-
-    /* set default settings */
-    infoPtr->hwndChild = 0;
-    infoPtr->clrBk = GetSysColor32 (COLOR_BTNFACE);
-    infoPtr->iBorder = 0;
-    infoPtr->iButtonSize = 0;
-    infoPtr->iPos = 0;
-
-
-    return 0;
-}
-
-
-static LRESULT
-PAGER_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-
-
-
-
-    /* free pager info data */
-    HeapFree (GetProcessHeap (), 0, infoPtr);
-
-    return 0;
-}
-
-
-static LRESULT
-PAGER_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-    HBRUSH32 hBrush = CreateSolidBrush32 (infoPtr->clrBk);
-    RECT32 rect;
-
-    GetClientRect32 (wndPtr->hwndSelf, &rect);
-    FillRect32 ((HDC32)wParam, &rect, hBrush);
-    DeleteObject32 (hBrush);
-    return TRUE;
-}
-
-
-// << PAGER_MouseMove >>
-// << PAGER_Paint >>
-
-
-LRESULT WINAPI
-PAGER_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
-{
-    WND *wndPtr = WIN_FindWndPtr(hwnd);
-
-    switch (uMsg)
-    {
-	case PGM_FORWARDMOUSE:
-	    return PAGER_ForwardMouse (wndPtr, wParam);
-
-	case PGM_GETBKCOLOR:
-	    return PAGER_GetBkColor (wndPtr, wParam, lParam);
-
-	case PGM_GETBORDER:
-	    return PAGER_GetBorder (wndPtr, wParam, lParam);
-
-	case PGM_GETBUTTONSIZE:
-	    return PAGER_GetButtonSize (wndPtr, wParam, lParam);
-
-//	case PGM_GETBUTTONSTATE:
-//	case PGM_GETDROPTARGET:
-
-	case PGM_GETPOS:
-	    return PAGER_SetPos (wndPtr, wParam, lParam);
-
-	case PGM_RECALCSIZE:
-	    return PAGER_RecalcSize (wndPtr, wParam, lParam);
-
-	case PGM_SETBKCOLOR:
-	    return PAGER_SetBkColor (wndPtr, wParam, lParam);
-
-	case PGM_SETBORDER:
-	    return PAGER_SetBorder (wndPtr, wParam, lParam);
-
-	case PGM_SETBUTTONSIZE:
-	    return PAGER_SetButtonSize (wndPtr, wParam, lParam);
-
-	case PGM_SETCHILD:
-	    return PAGER_SetChild (wndPtr, wParam, lParam);
-
-	case PGM_SETPOS:
-	    return PAGER_SetPos (wndPtr, wParam, lParam);
-
-	case WM_CREATE:
-	    return PAGER_Create (wndPtr, wParam, lParam);
-
-	case WM_DESTROY:
-	    return PAGER_Destroy (wndPtr, wParam, lParam);
-
-	case WM_ERASEBKGND:
-	    return PAGER_EraseBackground (wndPtr, wParam, lParam);
-
-//	case WM_MOUSEMOVE:
-//	    return PAGER_MouseMove (wndPtr, wParam, lParam);
-
-//	case WM_PAINT:
-//	    return PAGER_Paint (wndPtr, wParam);
-
-
-	default:
-	    if (uMsg >= WM_USER)
-		ERR (pager, "unknown msg %04x wp=%08x lp=%08lx\n",
-		     uMsg, wParam, lParam);
-	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
-    }
-    return 0;
-}
-
-
-void
-PAGER_Register (void)
-{
-    WNDCLASS32A wndClass;
-
-    if (GlobalFindAtom32A (WC_PAGESCROLLER32A)) return;
-
-    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
-    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS;
-    wndClass.lpfnWndProc   = (WNDPROC32)PAGER_WindowProc;
-    wndClass.cbClsExtra    = 0;
-    wndClass.cbWndExtra    = sizeof(PAGER_INFO *);
-    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
-    wndClass.hbrBackground = 0;
-    wndClass.lpszClassName = WC_PAGESCROLLER32A;
- 
-    RegisterClass32A (&wndClass);
-}
-
diff --git a/controls/progress.c b/controls/progress.c
deleted file mode 100644
index 3acb294..0000000
--- a/controls/progress.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/*		
- * Progress control
- *
- * Copyright 1997 Dimitrie O. Paun
- *
- * TODO:
- *   - I do not know what to to on WM_[SG]ET_FONT
- */
-
-#include "windows.h"
-#include "progress.h"
-#include "commctrl.h"
-#include "heap.h"
-#include "win.h"
-#include "debug.h"
-
-
-/* Control configuration constants */
-
-#define LED_GAP    2
-
-/* Work constants */
-
-#define UNKNOWN_PARAM(msg, wParam, lParam) WARN(progress, \
-        "Unknown parameter(s) for message " #msg     \
-	"(%04x): wp=%04x lp=%08lx\n", msg, wParam, lParam); 
-
-#define PROGRESS_GetInfoPtr(wndPtr) ((PROGRESS_INFO *)wndPtr->wExtra[0])
-
-
-/***********************************************************************
- * PROGRESS_Draw
- * Draws the progress bar.
- */
-static void
-PROGRESS_Draw (WND *wndPtr, HDC32 hdc)
-{
-  PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(wndPtr);
-  HBRUSH32 hbrBar, hbrBk;
-  int rightBar, rightMost, ledWidth;
-  RECT32 rect;
-
-  TRACE(progress, "refresh pos=%d min=%d, max=%d\n",
-	       infoPtr->CurVal, infoPtr->MinVal, infoPtr->MaxVal);
-
-  /* get the required bar brush */
-  if (infoPtr->ColorBar == CLR_DEFAULT)
-    hbrBar = GetSysColorBrush32(COLOR_HIGHLIGHT);
-  else
-    hbrBar = CreateSolidBrush32 (infoPtr->ColorBar);
-
-  /* get the required background brush */
-  if (infoPtr->ColorBk == CLR_DEFAULT)
-    hbrBk = GetSysColorBrush32 (COLOR_3DFACE);
-  else
-    hbrBk = CreateSolidBrush32 (infoPtr->ColorBk);
-
-  /* get client rectangle */
-  GetClientRect32 (wndPtr->hwndSelf, &rect);
-
-  /* draw the background */
-  FillRect32(hdc, &rect, hbrBk);
-
-  rect.left++; rect.right--; rect.top++; rect.bottom--;
-
-  /* compute extent of progress bar */
-  if (wndPtr->dwStyle & PBS_VERTICAL)
-  {
-    rightBar = rect.bottom - 
-      MulDiv32(infoPtr->CurVal-infoPtr->MinVal,
-	       rect.bottom - rect.top,
-	       infoPtr->MaxVal-infoPtr->MinVal);
-    ledWidth = MulDiv32 ((rect.right - rect.left), 2, 3);
-    rightMost = rect.top;
-  }
-  else
-  {
-    rightBar = rect.left + 
-      MulDiv32(infoPtr->CurVal-infoPtr->MinVal,
-	       rect.right - rect.left,
-	       infoPtr->MaxVal-infoPtr->MinVal);
-    ledWidth = MulDiv32 ((rect.bottom - rect.top), 2, 3);
-    rightMost = rect.right;
-  }
-
-  /* now draw the bar */
-  if (wndPtr->dwStyle & PBS_SMOOTH)
-  {
-    if (wndPtr->dwStyle & PBS_VERTICAL)
-      rect.top = rightBar;
-    else
-      rect.right = rightBar;
-    FillRect32(hdc, &rect, hbrBar);
-  }
-  else
-  {
-    if (wndPtr->dwStyle & PBS_VERTICAL)
-      while(rect.bottom > rightBar) { 
-        rect.top = rect.bottom-ledWidth;
-        if (rect.top < rightMost)
-          rect.top = rightMost;
-        FillRect32(hdc, &rect, hbrBar);
-        rect.bottom = rect.top-LED_GAP;
-      }
-    else
-      while(rect.left < rightBar) { 
-        rect.right = rect.left+ledWidth;
-        if (rect.right > rightMost)
-          rect.right = rightMost;
-        FillRect32(hdc, &rect, hbrBar);
-        rect.left  = rect.right+LED_GAP;
-      }
-  }
-
-  /* delete bar brush */
-  if (infoPtr->ColorBar != CLR_DEFAULT)
-      DeleteObject32 (hbrBar);
-
-  /* delete background brush */
-  if (infoPtr->ColorBk != CLR_DEFAULT)
-      DeleteObject32 (hbrBk);
-}
-
-/***********************************************************************
- * PROGRESS_Refresh
- * Draw the progress bar. The background need not be erased.
- */
-static void
-PROGRESS_Refresh (WND *wndPtr)
-{
-    HDC32 hdc;
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    PROGRESS_Draw (wndPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-}
-
-/***********************************************************************
- * PROGRESS_Paint
- * Draw the progress bar. The background need not be erased.
- * If dc!=0, it draws on it
- */
-static void
-PROGRESS_Paint (WND *wndPtr)
-{
-    PAINTSTRUCT32 ps;
-    HDC32 hdc;
-
-    hdc = BeginPaint32 (wndPtr->hwndSelf, &ps);
-    PROGRESS_Draw (wndPtr, hdc);
-    EndPaint32 (wndPtr->hwndSelf, &ps);
-}
-
-
-/***********************************************************************
- *           PROGRESS_CoercePos
- * Makes sure the current position (CUrVal) is within bounds.
- */
-static void PROGRESS_CoercePos(WND *wndPtr)
-{
-  PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(wndPtr); 
-
-  if(infoPtr->CurVal < infoPtr->MinVal)
-    infoPtr->CurVal = infoPtr->MinVal;
-  if(infoPtr->CurVal > infoPtr->MaxVal)
-    infoPtr->CurVal = infoPtr->MaxVal;
-}
-
-/***********************************************************************
- *           ProgressWindowProc
- */
-LRESULT WINAPI ProgressWindowProc(HWND32 hwnd, UINT32 message, 
-                                  WPARAM32 wParam, LPARAM lParam)
-{
-  WND *wndPtr = WIN_FindWndPtr(hwnd);
-  PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(wndPtr); 
-  UINT32 temp;
-
-  switch(message)
-    {
-    case WM_NCCREATE:
-      wndPtr->dwExStyle |= WS_EX_STATICEDGE;
-      return TRUE;
-
-    case WM_CREATE:
-      /* allocate memory for info struct */
-      infoPtr = 
-	(PROGRESS_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-                                    sizeof(PROGRESS_INFO));
-      wndPtr->wExtra[0] = (DWORD)infoPtr;
-
-      /* initialize the info struct */
-      infoPtr->MinVal=0; 
-      infoPtr->MaxVal=100;
-      infoPtr->CurVal=0; 
-      infoPtr->Step=10;
-      infoPtr->ColorBar=CLR_DEFAULT;
-      infoPtr->ColorBk=CLR_DEFAULT;
-      TRACE(progress, "Progress Ctrl creation, hwnd=%04x\n", hwnd);
-      break;
-    
-    case WM_DESTROY:
-      TRACE(progress, "Progress Ctrl destruction, hwnd=%04x\n", hwnd);
-      HeapFree (GetProcessHeap (), 0, infoPtr);
-      break;
-
-    case WM_ERASEBKGND:
-      /* pretend to erase it here, but we will do it in the paint
-	 function to avoid flicker */
-      return 1;
-	
-    case WM_GETFONT:
-      FIXME (progress, "WM_GETFONT - empty message!\n");
-      /* FIXME: What do we need to do? */
-      break;
-
-    case WM_SETFONT:
-      FIXME (progress, "WM_SETFONT - empty message!\n");
-      /* FIXME: What do we need to do? */
-      break;
-
-    case WM_PAINT:
-      PROGRESS_Paint (wndPtr);
-      break;
-    
-    case PBM_DELTAPOS:
-      if(lParam)
-	UNKNOWN_PARAM(PBM_DELTAPOS, wParam, lParam);
-      temp = infoPtr->CurVal;
-      if(wParam != 0){
-	infoPtr->CurVal += (UINT16)wParam;
-	PROGRESS_CoercePos(wndPtr);
-	PROGRESS_Refresh (wndPtr);
-      }
-      return temp;
-
-    case PBM_SETPOS:
-      if (lParam)
-	UNKNOWN_PARAM(PBM_SETPOS, wParam, lParam);
-      temp = infoPtr->CurVal;
-      if(temp != wParam){
-	infoPtr->CurVal = (UINT16)wParam;
-	PROGRESS_CoercePos(wndPtr);
-	PROGRESS_Refresh (wndPtr);
-      }
-      return temp;          
-      
-    case PBM_SETRANGE:
-      if (wParam)
-	UNKNOWN_PARAM(PBM_SETRANGE, wParam, lParam);
-      temp = MAKELONG(infoPtr->MinVal, infoPtr->MaxVal);
-      if(temp != lParam){
-	infoPtr->MinVal = LOWORD(lParam); 
-	infoPtr->MaxVal = HIWORD(lParam);
-	if(infoPtr->MaxVal <= infoPtr->MinVal)
-	  infoPtr->MaxVal = infoPtr->MinVal+1;
-	PROGRESS_CoercePos(wndPtr);
-	PROGRESS_Refresh (wndPtr);
-      }
-      return temp;
-
-    case PBM_SETSTEP:
-      if (lParam)
-	UNKNOWN_PARAM(PBM_SETSTEP, wParam, lParam);
-      temp = infoPtr->Step;   
-      infoPtr->Step = (UINT16)wParam;   
-      return temp;
-
-    case PBM_STEPIT:
-      if (wParam || lParam)
-	UNKNOWN_PARAM(PBM_STEPIT, wParam, lParam);
-      temp = infoPtr->CurVal;   
-      infoPtr->CurVal += infoPtr->Step;
-      if(infoPtr->CurVal > infoPtr->MaxVal)
-	infoPtr->CurVal = infoPtr->MinVal;
-      if(temp != infoPtr->CurVal)
-	PROGRESS_Refresh (wndPtr);
-      return temp;
-
-    case PBM_SETRANGE32:
-      temp = MAKELONG(infoPtr->MinVal, infoPtr->MaxVal);
-      if((infoPtr->MinVal != (INT32)wParam) ||
-         (infoPtr->MaxVal != (INT32)lParam)) {
-	infoPtr->MinVal = (INT32)wParam;
-	infoPtr->MaxVal = (INT32)lParam;
-	if(infoPtr->MaxVal <= infoPtr->MinVal)
-	  infoPtr->MaxVal = infoPtr->MinVal+1;
-	PROGRESS_CoercePos(wndPtr);
-	PROGRESS_Refresh (wndPtr);
-      }
-      return temp;
-    
-    case PBM_GETRANGE:
-      if (lParam){
-        ((PPBRANGE)lParam)->iLow = infoPtr->MinVal;
-        ((PPBRANGE)lParam)->iHigh = infoPtr->MaxVal;
-      }
-      return (wParam) ? infoPtr->MinVal : infoPtr->MaxVal;
-
-    case PBM_GETPOS:
-      if (wParam || lParam)
-	UNKNOWN_PARAM(PBM_STEPIT, wParam, lParam);
-      return (infoPtr->CurVal);
-
-    case PBM_SETBARCOLOR:
-      if (wParam)
-	UNKNOWN_PARAM(PBM_SETBARCOLOR, wParam, lParam);
-      infoPtr->ColorBar = (COLORREF)lParam;     
-      PROGRESS_Refresh (wndPtr);
-      break;
-
-    case PBM_SETBKCOLOR:
-      if (wParam)
-	UNKNOWN_PARAM(PBM_SETBKCOLOR, wParam, lParam);
-      infoPtr->ColorBk = (COLORREF)lParam;
-      PROGRESS_Refresh (wndPtr);
-      break;
-
-    default: 
-      if (message >= WM_USER) 
-	ERR(progress, "unknown msg %04x wp=%04x lp=%08lx\n", 
-		    message, wParam, lParam );
-      return DefWindowProc32A( hwnd, message, wParam, lParam ); 
-    } 
-
-    return 0;
-}
-
-
-/***********************************************************************
- *           PROGRESS_Register [Internal]
- *
- * Registers the progress bar window class.
- * 
- */
-void 
-PROGRESS_Register(void)
-{
-    WNDCLASS32A wndClass;
-
-    if( GlobalFindAtom32A( PROGRESS_CLASS32A ) ) return;
-
-    ZeroMemory( &wndClass, sizeof( WNDCLASS32A ) );
-    wndClass.style         = CS_GLOBALCLASS | CS_VREDRAW | CS_HREDRAW;
-    wndClass.lpfnWndProc   = (WNDPROC32)ProgressWindowProc;
-    wndClass.cbClsExtra    = 0;
-    wndClass.cbWndExtra    = sizeof(PROGRESS_INFO *);
-    wndClass.hCursor       = LoadCursor32A( 0, IDC_ARROW32A );
-    wndClass.lpszClassName = PROGRESS_CLASS32A;
-
-    RegisterClass32A( &wndClass );
-}
-
diff --git a/controls/rebar.c b/controls/rebar.c
deleted file mode 100644
index a36bbff..0000000
--- a/controls/rebar.c
+++ /dev/null
@@ -1,637 +0,0 @@
-/*
- * Rebar control
- *
- * Copyright 1998 Eric Kohl
- *
- * NOTES
- *   This is just a dummy control. An author is needed! Any volunteers?
- *   I will only improve this control once in a while.
- *     Eric <ekohl@abo.rhein-zeitung.de>
- *
- * TODO:
- *   - All messages.
- *   - All notifications.
- */
-
-#include "windows.h"
-#include "commctrl.h"
-#include "rebar.h"
-#include "heap.h"
-#include "win.h"
-#include "debug.h"
-
-
-#define REBAR_GetInfoPtr(wndPtr) ((REBAR_INFO *)wndPtr->wExtra[0])
-
-
-// << REBAR_BeginDrag >>
-// << REBAR_DeleteBand >>
-// << REBAR_DragMove >>
-// << REBAR_EndDrag >>
-// << REBAR_GetBandBorders >>
-
-
-__inline__ static LRESULT
-REBAR_GetBandCount (WND *wndPtr)
-{
-    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (wndPtr);
-
-    TRACE (rebar, "band count %u!\n", infoPtr->uNumBands);
-
-    return infoPtr->uNumBands;
-}
-
-
-static LRESULT
-REBAR_GetBandInfo32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (wndPtr);
-    LPREBARBANDINFO32A lprbbi = (LPREBARBANDINFO32A)lParam;
-    REBAR_BAND *lpBand;
-
-    if (lprbbi == NULL)
-	return FALSE;
-    if (lprbbi->cbSize < sizeof (LPREBARBANDINFO32A))
-	return FALSE;
-    if ((UINT32)wParam >= infoPtr->uNumBands)
-	return FALSE;
-
-    TRACE (rebar, "index %u\n", (UINT32)wParam);
-
-    /* copy band information */
-    lpBand = &infoPtr->bands[(UINT32)wParam];
-
-    if (lprbbi->fMask & RBBIM_STYLE)
-	lprbbi->fStyle = lpBand->fStyle;
-
-    if (lprbbi->fMask & RBBIM_COLORS) {
-	lprbbi->clrFore = lpBand->clrFore;
-	lprbbi->clrBack = lpBand->clrBack;
-    }
-
-    if ((lprbbi->fMask & RBBIM_TEXT) && 
-	(lprbbi->lpText) && (lpBand->lpText)) {
-	    lstrcpyn32A (lprbbi->lpText, lpBand->lpText, lprbbi->cch);
-    }
-
-    if (lprbbi->fMask & RBBIM_IMAGE)
-	lprbbi->iImage = lpBand->iImage;
-
-    if (lprbbi->fMask & RBBIM_CHILD)
-	lprbbi->hwndChild = lpBand->hwndChild;
-
-    if (lprbbi->fMask & RBBIM_CHILDSIZE) {
-	lprbbi->cxMinChild = lpBand->cxMinChild;
-	lprbbi->cyMinChild = lpBand->cyMinChild;
-	lprbbi->cyMaxChild = lpBand->cyMaxChild;
-	lprbbi->cyChild    = lpBand->cyChild;
-	lprbbi->cyIntegral = lpBand->cyIntegral;
-    }
-
-    if (lprbbi->fMask & RBBIM_SIZE)
-	lprbbi->cx = lpBand->cx;
-
-    if (lprbbi->fMask & RBBIM_BACKGROUND)
-	lprbbi->hbmBack = lpBand->hbmBack;
-
-    if (lprbbi->fMask & RBBIM_ID)
-	lprbbi->wID = lpBand->wID;
-
-    /* FIXME: check for size of band info structure */
-
-    if (lprbbi->fMask & RBBIM_IDEALSIZE)
-	lprbbi->cxIdeal = lpBand->cxIdeal;
-
-    if (lprbbi->fMask & RBBIM_LPARAM)
-	lprbbi->lParam = lpBand->lParam;
-
-    if (lprbbi->fMask & RBBIM_HEADERSIZE)
-	lprbbi->cxHeader = lpBand->cxHeader;
-
-    return TRUE;
-}
-
-
-// << REBAR_GetBandInfo32W >>
-
-// << REBAR_GetBarHeight >>
-
-
-static LRESULT
-REBAR_GetBarInfo (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (wndPtr);
-    LPREBARINFO lpInfo = (LPREBARINFO)lParam;
-
-    if (lpInfo == NULL)
-	return FALSE;
-
-    if (lpInfo->cbSize < sizeof (REBARINFO))
-	return FALSE;
-
-    TRACE (rebar, "getting bar info!\n");
-
-    if (infoPtr->himl) {
-	lpInfo->himl = infoPtr->himl;
-	lpInfo->fMask |= RBIM_IMAGELIST;
-    }
-
-    return TRUE;
-}
-
-
-__inline__ static LRESULT
-REBAR_GetBkColor (WND *wndPtr)
-{
-    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (wndPtr);
-
-    TRACE (rebar, "background color 0x%06lx!\n", infoPtr->clrBk);
-
-    return infoPtr->clrBk;
-}
-
-
-// << REBAR_GetColorScheme >>
-
-// << REBAR_GetRowHeight >>
-
-
-__inline__ static LRESULT
-REBAR_GetTextColor (WND *wndPtr)
-{
-    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (wndPtr);
-
-    TRACE (rebar, "text color 0x%06lx!\n", infoPtr->clrText);
-
-    return infoPtr->clrText;
-}
-
-
-// << REBAR_GetToolTips >>
-// << REBAR_GetUnicodeFormat >>
-// << REBAR_HitTest >>
-
-
-static LRESULT
-REBAR_IdToIndex (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (wndPtr);
-    UINT32 i;
-
-    if (infoPtr == NULL)
-	return -1;
-
-    if (infoPtr->uNumBands < 1)
-	return -1;
-
-    TRACE (rebar, "id %u\n", (UINT32)wParam);
-
-    for (i = 0; i < infoPtr->uNumBands; i++) {
-	if (infoPtr->bands[i].wID == (UINT32)wParam)
-	    return i;
-    }
-
-    return -1;
-}
-
-
-static LRESULT
-REBAR_InsertBand32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (wndPtr);
-    LPREBARBANDINFO32A lprbbi = (LPREBARBANDINFO32A)lParam;
-    UINT32 uIndex = (UINT32)wParam;
-    REBAR_BAND *lpBand;
-
-    if (infoPtr == NULL)
-	return FALSE;
-    if (lprbbi == NULL)
-	return FALSE;
-    if (lprbbi->cbSize < sizeof (REBARBANDINFO32A))
-	return FALSE;
-
-    if (infoPtr->uNumBands == 0) {
-	infoPtr->bands =
-	    (REBAR_BAND *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-				     sizeof (REBAR_BAND));
-	uIndex = 0;
-    }
-    else {
-	REBAR_BAND *oldBands = infoPtr->bands;
-	infoPtr->bands =
-	    (REBAR_BAND *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-				     (infoPtr->uNumBands+1)*sizeof(REBAR_BAND));
-	if ((INT32)uIndex == -1)
-	    uIndex = infoPtr->uNumBands;
-
-	/* pre copy */
-
-	/* post copy */
-
-	HeapFree (GetProcessHeap (), 0, &oldBands);
-    }
-
-    infoPtr->uNumBands++;
-
-    TRACE (rebar, "index %u!\n", uIndex);
-
-    /* initialize band (infoPtr->bands[uIndex])*/
-    lpBand = &infoPtr->bands[uIndex];
-
-    if (lprbbi->fMask & RBBIM_STYLE)
-	lpBand->fStyle = lprbbi->fStyle;
-
-    if (lprbbi->fMask & RBBIM_COLORS) {
-	lpBand->clrFore = lprbbi->clrFore;
-	lpBand->clrBack = lprbbi->clrBack;
-    }
-
-    if ((lprbbi->fMask & RBBIM_TEXT) && (lprbbi->lpText)) {
-	INT32 len = lstrlen32A (lprbbi->lpText);
-	if (len > 0) {
-	    lpBand->lpText = 
-		(LPSTR)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len + 1);
-	    lstrcpy32A (lpBand->lpText, lprbbi->lpText);
-	}
-    }
-
-    if (lprbbi->fMask & RBBIM_IMAGE)
-	lpBand->iImage = lprbbi->iImage;
-
-    if (lprbbi->fMask & RBBIM_CHILD)
-	lpBand->hwndChild = lprbbi->hwndChild;
-
-    if (lprbbi->fMask & RBBIM_CHILDSIZE) {
-	lpBand->cxMinChild = lprbbi->cxMinChild;
-	lpBand->cyMinChild = lprbbi->cyMinChild;
-	lpBand->cyMaxChild = lprbbi->cyMaxChild;
-	lpBand->cyChild    = lprbbi->cyChild;
-	lpBand->cyIntegral = lprbbi->cyIntegral;
-    }
-
-    if (lprbbi->fMask & RBBIM_SIZE)
-	lpBand->cx = lprbbi->cx;
-
-    if (lprbbi->fMask & RBBIM_BACKGROUND)
-	lpBand->hbmBack = lprbbi->hbmBack;
-
-    if (lprbbi->fMask & RBBIM_ID)
-	lpBand->wID = lprbbi->wID;
-
-    /* FIXME: check for size of band info structure */
-
-    if (lprbbi->fMask & RBBIM_IDEALSIZE)
-	lpBand->cxIdeal = lprbbi->cxIdeal;
-
-    if (lprbbi->fMask & RBBIM_LPARAM)
-	lpBand->lParam = lprbbi->lParam;
-
-    if (lprbbi->fMask & RBBIM_HEADERSIZE)
-	lpBand->cxHeader = lprbbi->cxHeader;
-
-    return TRUE;
-}
-
-
-// << REBAR_InsertBand32W >>
-// << REBAR_MaximizeBand >>
-// << REBAR_MinimizeBand >>
-// << REBAR_MoveBand >>
-
-
-static LRESULT
-REBAR_SetBandInfo32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (wndPtr);
-    LPREBARBANDINFO32A lprbbi = (LPREBARBANDINFO32A)lParam;
-    REBAR_BAND *lpBand;
-
-    if (lprbbi == NULL)
-	return FALSE;
-    if (lprbbi->cbSize < sizeof (LPREBARBANDINFO32A))
-	return FALSE;
-    if ((UINT32)wParam >= infoPtr->uNumBands)
-	return FALSE;
-
-    TRACE (rebar, "index %u\n", (UINT32)wParam);
-
-    /* set band information */
-    lpBand = &infoPtr->bands[(UINT32)wParam];
-
-    if (lprbbi->fMask & RBBIM_STYLE)
-	lpBand->fStyle = lprbbi->fStyle;
-
-    if (lprbbi->fMask & RBBIM_COLORS) {
-	lpBand->clrFore = lprbbi->clrFore;
-	lpBand->clrBack = lprbbi->clrBack;
-    }
-
-    if ((lprbbi->fMask & RBBIM_TEXT) && (lprbbi->lpText)) {
-/*
-	INT32 len = lstrlen32A (lprbbi->lpText);
-	if (len > 0) {
-	    lpBand->lpText = 
-		(LPSTR)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len + 1);
-	    lstrcpy32A (lpBand->lpText, lprbbi->lpText);
-	}
-*/
-    }
-
-    if (lprbbi->fMask & RBBIM_IMAGE)
-	lpBand->iImage = lprbbi->iImage;
-
-    if (lprbbi->fMask & RBBIM_CHILD)
-	lpBand->hwndChild = lprbbi->hwndChild;
-
-    if (lprbbi->fMask & RBBIM_CHILDSIZE) {
-	lpBand->cxMinChild = lprbbi->cxMinChild;
-	lpBand->cyMinChild = lprbbi->cyMinChild;
-	lpBand->cyMaxChild = lprbbi->cyMaxChild;
-	lpBand->cyChild    = lprbbi->cyChild;
-	lpBand->cyIntegral = lprbbi->cyIntegral;
-    }
-
-    if (lprbbi->fMask & RBBIM_SIZE)
-	lpBand->cx = lprbbi->cx;
-
-    if (lprbbi->fMask & RBBIM_BACKGROUND)
-	lpBand->hbmBack = lprbbi->hbmBack;
-
-    if (lprbbi->fMask & RBBIM_ID)
-	lpBand->wID = lprbbi->wID;
-
-    /* FIXME: check for size of band info structure */
-
-    if (lprbbi->fMask & RBBIM_IDEALSIZE)
-	lpBand->cxIdeal = lprbbi->cxIdeal;
-
-    if (lprbbi->fMask & RBBIM_LPARAM)
-	lpBand->lParam = lprbbi->lParam;
-
-    if (lprbbi->fMask & RBBIM_HEADERSIZE)
-	lpBand->cxHeader = lprbbi->cxHeader;
-
-    return TRUE;
-}
-
-
-// << REBAR_SetBandInfo32W >>
-
-
-static LRESULT
-REBAR_SetBarInfo (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (wndPtr);
-    LPREBARINFO lpInfo = (LPREBARINFO)lParam;
-
-    if (lpInfo == NULL)
-	return FALSE;
-
-    if (lpInfo->cbSize < sizeof (REBARINFO))
-	return FALSE;
-
-    TRACE (rebar, "setting bar info!\n");
-
-    if (lpInfo->fMask & RBIM_IMAGELIST)
-	infoPtr->himl = lpInfo->himl;
-
-    return TRUE;
-}
-
-
-static LRESULT
-REBAR_SetBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (wndPtr);
-    COLORREF clrTemp;
-
-    clrTemp = infoPtr->clrBk;
-    infoPtr->clrBk = (COLORREF)lParam;
-
-    TRACE (rebar, "background color 0x%06lx!\n", infoPtr->clrBk);
-
-    return clrTemp;
-}
-
-
-// << REBAR_SetColorScheme >>
-// << REBAR_SetPalette >>
-// << REBAR_SetParent >>
-
-
-static LRESULT
-REBAR_SetTextColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (wndPtr);
-    COLORREF clrTemp;
-
-    clrTemp = infoPtr->clrText;
-    infoPtr->clrText = (COLORREF)lParam;
-
-    TRACE (rebar, "text color 0x%06lx!\n", infoPtr->clrText);
-
-    return clrTemp;
-}
-
-
-// << REBAR_SetTooltips >>
-// << REBAR_SetUnicodeFormat >>
-// << REBAR_ShowBand >>
-// << REBAR_SizeToRect >>
-
-
-
-static LRESULT
-REBAR_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    REBAR_INFO *infoPtr;
-
-    /* allocate memory for info structure */
-    infoPtr = (REBAR_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-				       sizeof(REBAR_INFO));
-    wndPtr->wExtra[0] = (DWORD)infoPtr;
-
-    if (infoPtr == NULL) {
-	ERR (rebar, "could not allocate info memory!\n");
-	return 0;
-    }
-
-    if ((REBAR_INFO*)wndPtr->wExtra[0] != infoPtr) {
-	ERR (rebar, "pointer assignment error!\n");
-	return 0;
-    }
-
-
-    infoPtr->clrText = CLR_NONE;
-    infoPtr->clrText = RGB(0, 0, 0);
-
-    TRACE (rebar, "created!\n");
-    return 0;
-}
-
-
-static LRESULT
-REBAR_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    REBAR_INFO *infoPtr = REBAR_GetInfoPtr(wndPtr);
-    REBAR_BAND *lpBand;
-    INT32 i;
-
-
-    /* free rebar bands */
-    if ((infoPtr->uNumBands > 0) && infoPtr->bands) {
-	/* clean up each band */
-	for (i = 0; i < infoPtr->uNumBands; i++) {
-	    lpBand = &infoPtr->bands[i];
-
-	    /* delete text strings */
-	    if (lpBand->lpText) {
-		HeapFree (GetProcessHeap (), 0, lpBand->lpText);
-		lpBand->lpText = NULL;
-	    }
-	}
-
-	/* free band array */
-	HeapFree (GetProcessHeap (), 0, infoPtr->bands);
-	infoPtr->bands = NULL;
-    }
-
-    /* free rebar info data */
-    HeapFree (GetProcessHeap (), 0, infoPtr);
-
-    TRACE (rebar, "destroyed!\n");
-    return 0;
-}
-
-
-
-
-LRESULT WINAPI
-REBAR_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
-{
-    WND *wndPtr = WIN_FindWndPtr(hwnd);
-
-    switch (uMsg)
-    {
-//	case RB_BEGINDRAG:
-//	case RB_DELETEBAND:
-//	case RB_DRAGMOVE:
-//	case RB_ENDDRAG:
-//	case RB_GETBANDBORDERS:
-
-	case RB_GETBANDCOUNT:
-	    return REBAR_GetBandCount (wndPtr);
-
-//	case RB_GETBANDINFO32:  /* outdated, just for compatibility */
-
-	case RB_GETBANDINFO32A:
-	    return REBAR_GetBandInfo32A (wndPtr, wParam, lParam);
-
-
-//	case RB_GETBANDINFO32W:
-//	case RB_GETBARHEIGHT:
-
-	case RB_GETBARINFO:
-	    return REBAR_GetBarInfo (wndPtr, wParam, lParam);
-
-	case RB_GETBKCOLOR:
-	    return REBAR_GetBkColor (wndPtr);
-
-//	case RB_GETCOLORSCHEME:
-//	case RB_GETDROPTARGET:
-//	case RB_GETPALETTE:
-//	case RB_GETRECT:
-//	case RB_GETROWCOUNT:
-//	case RB_GETROWHEIGHT:
-
-	case RB_GETTEXTCOLOR:
-	    return REBAR_GetTextColor (wndPtr);
-
-//	case RB_GETTOOLTIPS:
-//	case RB_GETUNICODEFORMAT:
-//	case RB_HITTEST:
-
-	case RB_IDTOINDEX:
-	    return REBAR_IdToIndex (wndPtr, wParam, lParam);
-
-	case RB_INSERTBAND32A:
-	    return REBAR_InsertBand32A (wndPtr, wParam, lParam);
-
-//	case RB_INSERTBAND32W:
-//	case RB_MAXIMIZEBAND:
-//	case RB_MINIMIZEBAND:
-//	case RB_MOVEBAND:
-
-	case RB_SETBANDINFO32A:
-	    return REBAR_SetBandInfo32A (wndPtr, wParam, lParam);
-
-//	case RB_SETBANDINFO32W:
-
-	case RB_SETBARINFO:
-	    return REBAR_SetBarInfo (wndPtr, wParam, lParam);
-
-	case RB_SETBKCOLOR:
-	    return REBAR_SetBkColor (wndPtr, wParam, lParam);
-
-//	case RB_SETCOLORSCHEME:
-//	case RB_SETPALETTE:
-//	case RB_SETPARENT:
-
-	case RB_SETTEXTCOLOR:
-	    return REBAR_SetTextColor (wndPtr, wParam, lParam);
-
-//	case RB_SETTOOLTIPS:
-//	case RB_SETUNICODEFORMAT:
-//	case RB_SHOWBAND:
-//	case RB_SIZETORECT:
-
-
-	case WM_CREATE:
-	    return REBAR_Create (wndPtr, wParam, lParam);
-
-	case WM_DESTROY:
-	    return REBAR_Destroy (wndPtr, wParam, lParam);
-
-//	case WM_GETFONT:
-
-//	case WM_MOUSEMOVE:
-//	    return REBAR_MouseMove (wndPtr, wParam, lParam);
-
-//	case WM_PAINT:
-//	    return REBAR_Paint (wndPtr, wParam);
-
-//	case WM_SETFONT:
-
-//	case WM_TIMER:
-
-//	case WM_WININICHANGE:
-
-	default:
-	    if (uMsg >= WM_USER)
-		ERR (rebar, "unknown msg %04x wp=%08x lp=%08lx\n",
-		     uMsg, wParam, lParam);
-	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
-    }
-    return 0;
-}
-
-
-void
-REBAR_Register (void)
-{
-    WNDCLASS32A wndClass;
-
-    if (GlobalFindAtom32A (REBARCLASSNAME32A)) return;
-
-    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
-    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS;
-    wndClass.lpfnWndProc   = (WNDPROC32)REBAR_WindowProc;
-    wndClass.cbClsExtra    = 0;
-    wndClass.cbWndExtra    = sizeof(REBAR_INFO *);
-    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
-    wndClass.hbrBackground = 0;
-    wndClass.lpszClassName = REBARCLASSNAME32A;
- 
-    RegisterClass32A (&wndClass);
-}
-
diff --git a/controls/static.c b/controls/static.c
index ac53bbd..70c65f0 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -271,7 +271,6 @@
     case WM_GETDLGCODE:
         return DLGC_STATIC;
 
-    	return infoPtr->hIcon;
     case STM_GETIMAGE:
     case STM_GETICON16:
     case STM_GETICON32:
@@ -283,6 +282,7 @@
         InvalidateRect32( hWnd, NULL, FALSE );
         UpdateWindow32( hWnd );
 	break;
+
     case STM_SETICON16:
     case STM_SETICON32:
         lResult = STATIC_SetIcon( wndPtr, (HICON16)wParam );
diff --git a/controls/status.c b/controls/status.c
deleted file mode 100644
index 6536fa9..0000000
--- a/controls/status.c
+++ /dev/null
@@ -1,1150 +0,0 @@
-/*
- * Interface code to StatusWindow widget/control
- *
- * Copyright 1996 Bruce Milner
- * Copyright 1998 Eric Kohl
- */
-
-#include "windows.h"
-#include "status.h"
-#include "commctrl.h"
-#include "heap.h"
-#include "win.h"
-#include "debug.h"
-
-/*
- * Run tests using Waite Group Windows95 API Bible Vol. 1&2
- * The second cdrom contains executables drawstat.exe,gettext.exe,
- * simple.exe, getparts.exe, setparts.exe, statwnd.exe
- */
-
-/*
- * Fixme/Todo
- * 1) Don't hard code bar to bottom of window, allow CCS_TOP also.
- + 2) Tooltip support (almost done).
- */
-
-#define _MAX(a,b) (((a)>(b))?(a):(b))
-#define _MIN(a,b) (((a)>(b))?(b):(a))
-
-#define HORZ_BORDER 0
-#define VERT_BORDER 2
-#define HORZ_GAP    2
-
-#define STATUSBAR_GetInfoPtr(wndPtr) ((STATUSWINDOWINFO *)wndPtr->wExtra[0])
-
-
-static void
-STATUSBAR_DrawSizeGrip (HDC32 hdc, LPRECT32 lpRect)
-{
-    HPEN32 hOldPen;
-    POINT32 pt;
-    INT32 i;
-
-    pt.x = lpRect->right - 1;
-    pt.y = lpRect->bottom - 1;
-
-    hOldPen = SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DFACE));
-    MoveToEx32 (hdc, pt.x - 12, pt.y, NULL);
-    LineTo32 (hdc, pt.x, pt.y);
-    LineTo32 (hdc, pt.x, pt.y - 12);
-
-    pt.x--;
-    pt.y--;
-
-    SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DSHADOW));
-    for (i = 1; i < 11; i += 4) {
-	MoveToEx32 (hdc, pt.x - i, pt.y, NULL);
-	LineTo32 (hdc, pt.x, pt.y - i);
-
-	MoveToEx32 (hdc, pt.x - i-1, pt.y, NULL);
-	LineTo32 (hdc, pt.x, pt.y - i-1);
-    }
-
-    SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DHIGHLIGHT));
-    for (i = 3; i < 13; i += 4) {
-	MoveToEx32 (hdc, pt.x - i, pt.y, NULL);
-	LineTo32 (hdc, pt.x, pt.y - i);
-    }
-
-    SelectObject32 (hdc, hOldPen);
-}
-
-
-static void 
-STATUSBAR_DrawPart (HDC32 hdc, STATUSWINDOWPART *part)
-{
-    RECT32 r = part->bound;
-    UINT32 border = BDR_SUNKENOUTER;
-
-    if (part->style==SBT_POPOUT)
-      border = BDR_RAISEDOUTER;
-    else if (part->style==SBT_NOBORDERS)
-      border = 0;
-
-    DrawEdge32(hdc, &r, border, BF_RECT|BF_ADJUST);
-
-    /* draw the icon */
-    if (part->hIcon) {
-	INT32 cy = r.bottom - r.top;
-
-	r.left += 2;
-	DrawIconEx32 (hdc, r.left, r.top, part->hIcon, cy, cy, 0, 0, DI_NORMAL);
-	r.left += cy;
-    }
-
-    /* now draw text */
-    if (part->text) {
-      int oldbkmode = SetBkMode32(hdc, TRANSPARENT);
-      LPSTR p = (LPSTR)part->text;
-      UINT32 align = DT_LEFT;
-      if (*p == '\t') {
-	p++;
-	align = DT_CENTER;
-
-	if (*p == '\t') {
-	  p++;
-	  align = DT_RIGHT;
-	}
-      }
-      r.left += 3;
-      DrawText32A(hdc, p, lstrlen32A(p), &r, align|DT_VCENTER|DT_SINGLELINE);
-      if (oldbkmode != TRANSPARENT)
-	SetBkMode32(hdc, oldbkmode);
-    }
-}
-
-
-static VOID
-STATUSBAR_RefreshPart (WND *wndPtr, STATUSWINDOWPART *part, HDC32 hdc)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    HBRUSH32 hbrBk;
-    HFONT32  hOldFont;
-
-    if (!IsWindowVisible32(wndPtr->hwndSelf))
-        return;
-
-    if (self->clrBk != CLR_DEFAULT)
-	hbrBk = CreateSolidBrush32 (self->clrBk);
-    else
-	hbrBk = GetSysColorBrush32 (COLOR_3DFACE);
-    FillRect32(hdc, &part->bound, hbrBk);
-
-    hOldFont = SelectObject32 (hdc, self->hFont ? self->hFont : self->hDefaultFont);
-
-    if (part->style == SBT_OWNERDRAW) {
-	DRAWITEMSTRUCT32 dis;
-
-	dis.CtlID = wndPtr->wIDmenu;
-	dis.itemID = -1;
-	dis.hwndItem = wndPtr->hwndSelf;
-	dis.hDC = hdc;
-	dis.rcItem = part->bound;
-	dis.itemData = (INT32)part->text;
-	SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_DRAWITEM,
-			(WPARAM32)wndPtr->wIDmenu, (LPARAM)&dis);
-    }
-    else
-	STATUSBAR_DrawPart (hdc, part);
-
-    SelectObject32 (hdc, hOldFont);
-
-    if (self->clrBk != CLR_DEFAULT)
-	DeleteObject32 (hbrBk);
-
-    if (wndPtr->dwStyle & SBARS_SIZEGRIP) {
-	RECT32 rect;
-
-	GetClientRect32 (wndPtr->hwndSelf, &rect);
-	STATUSBAR_DrawSizeGrip (hdc, &rect);
-    }
-}
-
-
-static BOOL32
-STATUSBAR_Refresh (WND *wndPtr, HDC32 hdc)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    int      i;
-    RECT32   rect;
-    HBRUSH32 hbrBk;
-    HFONT32  hOldFont;
-
-    if (!IsWindowVisible32(wndPtr->hwndSelf))
-        return (TRUE);
-
-    GetClientRect32 (wndPtr->hwndSelf, &rect);
-
-    if (self->clrBk != CLR_DEFAULT)
-	hbrBk = CreateSolidBrush32 (self->clrBk);
-    else
-	hbrBk = GetSysColorBrush32 (COLOR_3DFACE);
-    FillRect32(hdc, &rect, hbrBk);
-
-    hOldFont = SelectObject32 (hdc, self->hFont ? self->hFont : self->hDefaultFont);
-
-    if (self->simple) {
-	STATUSBAR_DrawPart (hdc, &self->part0);
-    }
-    else {
-	for (i = 0; i < self->numParts; i++) {
-	    if (self->parts[i].style == SBT_OWNERDRAW) {
-		DRAWITEMSTRUCT32 dis;
-
-		dis.CtlID = wndPtr->wIDmenu;
-		dis.itemID = -1;
-		dis.hwndItem = wndPtr->hwndSelf;
-		dis.hDC = hdc;
-		dis.rcItem = self->parts[i].bound;
-		dis.itemData = (INT32)self->parts[i].text;
-		SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_DRAWITEM,
-				(WPARAM32)wndPtr->wIDmenu, (LPARAM)&dis);
-	    }
-	    else
-		STATUSBAR_DrawPart (hdc, &self->parts[i]);
-	}
-    }
-
-    SelectObject32 (hdc, hOldFont);
-
-    if (self->clrBk != CLR_DEFAULT)
-	DeleteObject32 (hbrBk);
-
-    if (wndPtr->dwStyle & SBARS_SIZEGRIP)
-	STATUSBAR_DrawSizeGrip (hdc, &rect);
-
-    return TRUE;
-}
-
-
-static void
-STATUSBAR_SetPartBounds (WND *wndPtr)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    STATUSWINDOWPART *part;
-    RECT32 rect, *r;
-    int	i;
-
-    /* get our window size */
-    GetClientRect32 (wndPtr->hwndSelf, &rect);
-
-    rect.top += VERT_BORDER;
-
-    /* set bounds for simple rectangle */
-    self->part0.bound = rect;
-
-    /* set bounds for non-simple rectangles */
-    for (i = 0; i < self->numParts; i++) {
-	part = &self->parts[i];
-	r = &self->parts[i].bound;
-	r->top = rect.top;
-	r->bottom = rect.bottom;
-	if (i == 0)
-	    r->left = 0;
-	else
-	    r->left = self->parts[i-1].bound.right + HORZ_GAP;
-	if (part->x == -1)
-	    r->right = rect.right;
-	else
-	    r->right = part->x;
-
-	if (self->hwndToolTip) {
-	    TTTOOLINFO32A ti;
-
-	    ti.cbSize = sizeof(TTTOOLINFO32A);
-	    ti.hwnd = wndPtr->hwndSelf;
-	    ti.uId = i;
-	    ti.rect = *r;
-	    SendMessage32A (self->hwndToolTip, TTM_NEWTOOLRECT32A,
-			    0, (LPARAM)&ti);
-	}
-    }
-}
-
-
-static VOID
-STATUSBAR_RelayEvent (HWND32 hwndTip, HWND32 hwndMsg, UINT32 uMsg,
-		      WPARAM32 wParam, LPARAM lParam)
-{
-    MSG32 msg;
-
-    msg.hwnd = hwndMsg;
-    msg.message = uMsg;
-    msg.wParam = wParam;
-    msg.lParam = lParam;
-    msg.time = GetMessageTime ();
-    msg.pt.x = LOWORD(GetMessagePos ());
-    msg.pt.y = HIWORD(GetMessagePos ());
-
-    SendMessage32A (hwndTip, TTM_RELAYEVENT, 0, (LPARAM)&msg);
-}
-
-
-__inline__ static LRESULT
-STATUSBAR_GetBorders (LPARAM lParam)
-{
-    LPINT32 out = (LPINT32) lParam;
-
-    out[0] = HORZ_BORDER; /* horizontal border width */
-    out[1] = VERT_BORDER; /* vertical border width */
-    out[2] = HORZ_GAP; /* width of border between rectangles */
-
-    return TRUE;
-}
-
-
-static LRESULT
-STATUSBAR_GetIcon (WND *wndPtr, WPARAM32 wParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    INT32 nPart;
-
-    nPart = (INT32)wParam & 0x00ff;
-    if ((nPart < -1) || (nPart >= self->numParts)) return 0;
-
-    if (nPart == -1)
-        return (self->part0.hIcon);
-    else
-        return (self->parts[nPart].hIcon);
-}
-
-
-static LRESULT
-STATUSBAR_GetParts (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    LPINT32 parts;
-    INT32   num_parts;
-    int	    i;
-
-    num_parts = (INT32) wParam;
-    parts = (LPINT32) lParam;
-    if (parts) {
-	return (self->numParts);
-	for (i = 0; i < num_parts; i++) {
-	    parts[i] = self->parts[i].x;
-	}
-    }
-    return (self->numParts);
-}
-
-
-static LRESULT
-STATUSBAR_GetRect (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    int	part_num;
-    LPRECT32  rect;
-
-    part_num = ((INT32) wParam) & 0x00ff;
-    rect = (LPRECT32) lParam;
-    if (self->simple)
-	*rect = self->part0.bound;
-    else
-	*rect = self->parts[part_num].bound;
-    return TRUE;
-}
-
-
-static LRESULT
-STATUSBAR_GetText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    STATUSWINDOWPART *part;
-    int	part_num;
-    LRESULT result;
-    LPSTR   out_text;
-
-    part_num = ((INT32) wParam) & 0x00ff;
-    out_text = (LPSTR) lParam;
-    if (self->simple)
-	part = &self->part0;
-    else
-	part = &self->parts[part_num];
-
-    if (part->style == SBT_OWNERDRAW)
-	result = (LRESULT) part->text;
-    else {
-	result = part->text ? lstrlen32A(part->text) : 0;
-	result |= (part->style << 16);
-	if (out_text) {
-	    lstrcpy32A(out_text, part->text);
-	}
-    }
-    return result;
-}
-
-
-//  << STATUSBAR_GetText32W >>
-
-
-static LRESULT
-STATUSBAR_GetTextLength32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    STATUSWINDOWPART *part;
-    int	part_num;
-    DWORD	result;
-
-    part_num = ((INT32) wParam) & 0x00ff;
-
-    if (self->simple)
-	part = &self->part0;
-    else
-	part = &self->parts[part_num];
-
-    if (part->text)
-	result = lstrlen32A(part->text);
-    else
-	result = 0;
-
-    result |= (part->style << 16);
-    return result;
-}
-
-
-//  << STATUSBAR_GetTextLength32W >>
-
-
-static LRESULT
-STATUSBAR_GetTipText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
-
-    if (infoPtr->hwndToolTip) {
-	TTTOOLINFO32A ti;
-
-	ti.cbSize = sizeof(TTTOOLINFO32A);
-	ti.hwnd = wndPtr->hwndSelf;
-	ti.uId = LOWORD(wParam);
-	SendMessage32A (infoPtr->hwndToolTip, TTM_GETTEXT32A, 0, (LPARAM)&ti);
-
-	if (ti.lpszText)
-	    lstrcpyn32A ((LPSTR)lParam, ti.lpszText, HIWORD(wParam));
-    }
-
-    return 0;
-}
-
-
-//  << STATUSBAR_GetTipText32W >>
-//  << STATUSBAR_GetUnicodeFormat >>
-
-
-__inline__ static LRESULT
-STATUSBAR_IsSimple (WND *wndPtr)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-
-    return self->simple;
-}
-
-
-static LRESULT
-STATUSBAR_SetBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    COLORREF oldBkColor;
-    HDC32    hdc;
-
-    oldBkColor = self->clrBk;
-    self->clrBk = (COLORREF)lParam;
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    STATUSBAR_Refresh (wndPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return oldBkColor;
-}
-
-
-static LRESULT
-STATUSBAR_SetIcon (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    INT32 nPart = (INT32)wParam & 0x00ff;
-    HDC32 hdc; 
-
-    if ((nPart < -1) || (nPart >= self->numParts)) return FALSE;
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    if (nPart == -1) {
-	self->part0.hIcon = (HICON32)lParam;
-	if (self->simple)
-	    STATUSBAR_RefreshPart (wndPtr, &self->part0, hdc);
-    }
-    else {
-	self->parts[nPart].hIcon = (HICON32)lParam;
-	if (!(self->simple))
-	    STATUSBAR_RefreshPart (wndPtr, &self->parts[nPart], hdc);
-    }
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return TRUE;
-}
-
-
-static LRESULT
-STATUSBAR_SetMinHeight (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-
-    if (IsWindowVisible32 (wndPtr->hwndSelf)) {
-	HWND32 parent = GetParent32 (wndPtr->hwndSelf);
-	INT32  width, x, y;
-	RECT32 parent_rect;
-
-	GetClientRect32 (parent, &parent_rect);
-	self->height = (INT32)wParam + VERT_BORDER;
-	width = parent_rect.right - parent_rect.left;
-	x = parent_rect.left;
-	y = parent_rect.bottom - self->height;
-	MoveWindow32 (wndPtr->hwndSelf, parent_rect.left,
-		      parent_rect.bottom - self->height,
-		      width, self->height, TRUE);
-	STATUSBAR_SetPartBounds (wndPtr);
-    }
-
-    return TRUE;
-}
-
-
-static LRESULT
-STATUSBAR_SetParts (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    HDC32	hdc;
-    LPINT32 parts;
-    STATUSWINDOWPART *	tmp;
-    int	i;
-    int	oldNumParts;
-
-    if (self->simple)
-	self->simple = FALSE;
-
-    oldNumParts = self->numParts;
-    self->numParts = (INT32) wParam;
-    parts = (LPINT32) lParam;
-    if (oldNumParts > self->numParts) {
-	for (i = self->numParts ; i < oldNumParts; i++) {
-	    if (self->parts[i].text && (self->parts[i].style != SBT_OWNERDRAW))
-		HeapFree(GetProcessHeap (), 0, self->parts[i].text);
-	}
-    }
-    else if (oldNumParts < self->numParts) {
-	tmp = HeapAlloc(GetProcessHeap (), HEAP_ZERO_MEMORY,
-			sizeof(STATUSWINDOWPART) * self->numParts);
-	for (i = 0; i < oldNumParts; i++) {
-	    tmp[i] = self->parts[i];
-	}
-	if (self->parts)
-	    HeapFree(GetProcessHeap (), 0, self->parts);
-	self->parts = tmp;
-    }
-    
-    for (i = 0; i < self->numParts; i++) {
-	self->parts[i].x = parts[i];
-    }
-
-    if (self->hwndToolTip) {
-	INT32 nTipCount =
-	    SendMessage32A (self->hwndToolTip, TTM_GETTOOLCOUNT, 0, 0);
-
-	if (nTipCount < self->numParts) {
-	    /* add tools */
-	    TTTOOLINFO32A ti;
-	    INT32 i;
-
-	    ZeroMemory (&ti, sizeof(TTTOOLINFO32A));
-	    ti.cbSize = sizeof(TTTOOLINFO32A);
-	    ti.hwnd = wndPtr->hwndSelf;
-	    for (i = nTipCount; i < self->numParts; i++) {
-		TRACE (statusbar, "add tool %d\n", i);
-		ti.uId = i;
-		SendMessage32A (self->hwndToolTip, TTM_ADDTOOL32A,
-				0, (LPARAM)&ti);
-	    }
-	}
-	else if (nTipCount > self->numParts) {
-	    /* delete tools */
-	    INT32 i;
-
-	    for (i = nTipCount - 1; i >= self->numParts; i--) {
-
-		TRACE (statusbar, "delete tool %d\n", i);
-
-	    }
-	}
-    }
-
-    STATUSBAR_SetPartBounds (wndPtr);
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    STATUSBAR_Refresh (wndPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return TRUE;
-}
-
-
-static LRESULT
-STATUSBAR_SetText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    STATUSWINDOWPART *part;
-    int	part_num;
-    int	style;
-    LPSTR text;
-    int	len;
-    HDC32 hdc;
-
-    text = (LPSTR) lParam;
-    part_num = ((INT32) wParam) & 0x00ff;
-    style = ((INT32) wParam) & 0xff00;
-
-    if ((self->simple) || (self->parts==NULL) || (part_num==255))
-	part = &self->part0;
-    else
-	part = &self->parts[part_num];
-    if (!part) return FALSE;
-    part->style = style;
-    if (style == SBT_OWNERDRAW) {
-	part->text = text;
-    }
-    else {
-	/* duplicate string */
-	if (part->text)
-	    HeapFree (GetProcessHeap (), 0, part->text);
-	part->text = 0;
-	if (text && (len = lstrlen32A(text))) {
-	    part->text = HeapAlloc (GetProcessHeap (), 0, len+1);
-	    lstrcpy32A(part->text, text);
-	}
-    }
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    STATUSBAR_RefreshPart (wndPtr, part, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return TRUE;
-}
-
-
-//  << STATUSBAR_SetText32W >>
-
-
-static LRESULT
-STATUSBAR_SetTipText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    TTTOOLINFO32A ti;
-
-    TRACE (statusbar, "part %d: \"%s\"\n", (INT32)wParam, (LPSTR)lParam);
-    if (self->hwndToolTip) {
-	ti.cbSize = sizeof(TTTOOLINFO32A);
-	ti.hwnd = wndPtr->hwndSelf;
-	ti.uId = (INT32)wParam;
-	ti.hinst = 0;
-	ti.lpszText = (LPSTR)lParam;
-	SendMessage32A (self->hwndToolTip, TTM_UPDATETIPTEXT32A,
-			0, (LPARAM)&ti);
-    }
-
-    return 0;
-}
-
-
-//  << STATUSBAR_SetTipText32W >>
-//  << STATUSBAR_SetUnicodeFormat >>
-
-
-static LRESULT
-STATUSBAR_Simple (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    BOOL32 simple;
-    HDC32  hdc;
-    NMHDR  nmhdr;
-
-    simple = (BOOL32) wParam;
-    self->simple = simple;
-
-    /* send notification */
-    nmhdr.hwndFrom = wndPtr->hwndSelf;
-    nmhdr.idFrom = wndPtr->wIDmenu;
-    nmhdr.code = SBN_SIMPLEMODECHANGE;
-    SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
-		    0, (LPARAM)&nmhdr);
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    STATUSBAR_Refresh (wndPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return TRUE;
-}
-
-
-static LRESULT
-STATUSBAR_WMCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    LPCREATESTRUCT32A lpCreate = (LPCREATESTRUCT32A) lParam;
-    NONCLIENTMETRICS32A nclm;
-    RECT32	rect;
-    int	        width, len;
-    HDC32	hdc;
-    STATUSWINDOWINFO *self;
-
-    self = (STATUSWINDOWINFO*)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-					 sizeof(STATUSWINDOWINFO));
-    wndPtr->wExtra[0] = (DWORD)self;
-
-    self->numParts = 1;
-    self->parts = 0;
-    self->simple = FALSE;
-    self->clrBk = CLR_DEFAULT;
-    self->hFont = 0;
-    GetClientRect32 (wndPtr->hwndSelf, &rect);
-
-    nclm.cbSize = sizeof(NONCLIENTMETRICS32A);
-    SystemParametersInfo32A (SPI_GETNONCLIENTMETRICS, 0, &nclm, 0);
-    self->hDefaultFont = CreateFontIndirect32A (&nclm.lfStatusFont);
-
-    /* initialize simple case */
-    self->part0.bound = rect;
-    self->part0.text = 0;
-    self->part0.x = 0;
-    self->part0.style = 0;
-    self->part0.hIcon = 0;
-
-    /* initialize first part */
-    self->parts = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-			     sizeof(STATUSWINDOWPART));
-    self->parts[0].bound = rect;
-    self->parts[0].text = 0;
-    self->parts[0].x = -1;
-    self->parts[0].style = 0;
-    self->parts[0].hIcon = 0;
-
-    if ((len = lstrlen32A (lpCreate->lpszName))) {
-        self->parts[0].text = HeapAlloc (GetProcessHeap (), 0, len + 1);
-        lstrcpy32A (self->parts[0].text, lpCreate->lpszName);
-    }
-
-    if ((hdc = GetDC32 (0))) {
-	TEXTMETRIC32A tm;
-	HFONT32 hOldFont;
-
-	hOldFont = SelectObject32 (hdc,self->hDefaultFont);
-	GetTextMetrics32A(hdc, &tm);
-	self->textHeight = tm.tmHeight;
-	SelectObject32 (hdc, hOldFont);
-	ReleaseDC32(0, hdc);
-    }
-
-    if (wndPtr->dwStyle & SBT_TOOLTIPS) {
-	self->hwndToolTip =
-	    CreateWindowEx32A (0, TOOLTIPS_CLASS32A, NULL, 0,
-			       CW_USEDEFAULT32, CW_USEDEFAULT32,
-			       CW_USEDEFAULT32, CW_USEDEFAULT32,
-			       wndPtr->hwndSelf, 0,
-			       wndPtr->hInstance, NULL);
-
-	if (self->hwndToolTip) {
-	    NMTOOLTIPSCREATED nmttc;
-
-	    nmttc.hdr.hwndFrom = wndPtr->hwndSelf;
-	    nmttc.hdr.idFrom = wndPtr->wIDmenu;
-	    nmttc.hdr.code = NM_TOOLTIPSCREATED;
-	    nmttc.hwndToolTips = self->hwndToolTip;
-
-	    SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
-			    (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmttc);
-	}
-    }
-
-    GetClientRect32 (GetParent32 (wndPtr->hwndSelf), &rect);
-    width = rect.right - rect.left;
-    self->height = self->textHeight + 4 + VERT_BORDER;
-    MoveWindow32 (wndPtr->hwndSelf, lpCreate->x, lpCreate->y-1,
-		  width, self->height, FALSE);
-    STATUSBAR_SetPartBounds (wndPtr);
-
-    return 0;
-}
-
-
-static LRESULT
-STATUSBAR_WMDestroy (WND *wndPtr)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    int	i;
-
-    for (i = 0; i < self->numParts; i++) {
-	if (self->parts[i].text && (self->parts[i].style != SBT_OWNERDRAW))
-	    HeapFree(GetProcessHeap (), 0, self->parts[i].text);
-    }
-    if (self->part0.text && (self->part0.style != SBT_OWNERDRAW))
-	HeapFree(GetProcessHeap (), 0, self->part0.text);
-    HeapFree(GetProcessHeap (), 0, self->parts);
-
-    /* delete default font */
-    if (self->hDefaultFont)
-	DeleteObject32 (self->hDefaultFont);
-
-    /* delete tool tip control */
-    if (self->hwndToolTip)
-	DestroyWindow32 (self->hwndToolTip);
-
-    HeapFree(GetProcessHeap (), 0, self);
-
-    return 0;
-}
-
-
-static __inline__ LRESULT
-STATUSBAR_WMGetFont (WND *wndPtr)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-
-    return self->hFont;
-}
-
-
-static LRESULT
-STATUSBAR_WMGetText (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    INT32 len;
-
-    if (!(self->parts[0].text))
-        return 0;
-    len = lstrlen32A (self->parts[0].text);
-    if (wParam > len) {
-        lstrcpy32A ((LPSTR)lParam, self->parts[0].text);
-        return len;
-    }
-    else
-        return -1;
-}
-
-
-static LRESULT
-STATUSBAR_WMGetTextLength (WND *wndPtr)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-
-    if (!(self->parts[0].text))
-        return 0;
-
-    return (lstrlen32A (self->parts[0].text));
-}
-
-
-__inline__ static LRESULT
-STATUSBAR_WMMouseMove (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-
-    if (self->hwndToolTip)
-	STATUSBAR_RelayEvent (self->hwndToolTip, wndPtr->hwndSelf,
-			      WM_MOUSEMOVE, wParam, lParam);
-    return 0;
-}
-
-
-static LRESULT
-STATUSBAR_WMNCHitTest (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    if (wndPtr->dwStyle & SBARS_SIZEGRIP) {
-	RECT32  rect;
-	POINT32 pt;
-
-	GetClientRect32 (wndPtr->hwndSelf, &rect);
-
-	pt.x = (INT32)LOWORD(lParam);
-	pt.y = (INT32)HIWORD(lParam);
-	ScreenToClient32 (wndPtr->hwndSelf, &pt);
-
-	rect.left = rect.right - 13;
-	rect.top += 2;
-
-	if (PtInRect32 (&rect, pt))
-	    return HTBOTTOMRIGHT;
-    }
-
-    return DefWindowProc32A (wndPtr->hwndSelf, WM_NCHITTEST, wParam, lParam);
-}
-
-
-static __inline__ LRESULT
-STATUSBAR_WMNCLButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    PostMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NCLBUTTONDOWN,
-		    wParam, lParam);
-    return 0;
-}
-
-
-static __inline__ LRESULT
-STATUSBAR_WMNCLButtonUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    PostMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NCLBUTTONUP,
-		    wParam, lParam);
-    return 0;
-}
-
-
-static LRESULT
-STATUSBAR_WMPaint (WND *wndPtr, WPARAM32 wParam)
-{
-    HDC32 hdc;
-    PAINTSTRUCT32 ps;
-
-    hdc = wParam==0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
-    STATUSBAR_Refresh (wndPtr, hdc);
-    if (!wParam)
-	EndPaint32 (wndPtr->hwndSelf, &ps);
-
-    return 0;
-}
-
-
-static LRESULT
-STATUSBAR_WMSetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-
-    self->hFont = (HFONT32)wParam;
-    if (LOWORD(lParam) == TRUE) {
-	HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
-        STATUSBAR_Refresh (wndPtr, hdc);
-        ReleaseDC32 (wndPtr->hwndSelf, hdc);
-    }
-
-    return 0;
-}
-
-
-static LRESULT
-STATUSBAR_WMSetText (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    STATUSWINDOWPART *part;
-    int len;
-    HDC32 hdc;
-
-    if (self->numParts == 0)
-	return FALSE;
-
-    part = &self->parts[0];
-    /* duplicate string */
-    if (part->text)
-        HeapFree(GetProcessHeap (), 0, part->text);
-    part->text = 0;
-    if (lParam && (len = lstrlen32A((LPCSTR)lParam))) {
-        part->text = HeapAlloc (GetProcessHeap (), 0, len+1);
-        lstrcpy32A (part->text, (LPCSTR)lParam);
-    }
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    STATUSBAR_RefreshPart (wndPtr, part, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return TRUE;
-}
-
-
-static LRESULT
-STATUSBAR_WMSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    INT32	width, x, y, flags;
-    RECT32	parent_rect;
-    HWND32	parent;
-
-    /* Need to resize width to match parent */
-    flags = (INT32) wParam;
-
-    /* FIXME for flags =
-     * SIZE_MAXIMIZED, SIZE_MAXSHOW, SIZE_MINIMIZED, SIZE_RESTORED
-     */
-
-    if (flags == SIZE_RESTORED) {
-	/* width and height don't apply */
-	parent = GetParent32 (wndPtr->hwndSelf);
-	GetClientRect32 (parent, &parent_rect);
-	width = parent_rect.right - parent_rect.left;
-	x = parent_rect.left;
-	y = parent_rect.bottom - self->height;
-	MoveWindow32 (wndPtr->hwndSelf, parent_rect.left, 
-		      parent_rect.bottom - self->height,
-		      width, self->height, TRUE);
-	STATUSBAR_SetPartBounds (wndPtr);
-    }
-    return 0;
-}
-
-
-static LRESULT
-STATUSBAR_SendNotify (WND *wndPtr, UINT32 code)
-{
-    NMHDR  nmhdr;
-
-    nmhdr.hwndFrom = wndPtr->hwndSelf;
-    nmhdr.idFrom = wndPtr->wIDmenu;
-    nmhdr.code = code;
-    SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
-		    0, (LPARAM)&nmhdr);
-    return 0;
-}
-
-
-
-LRESULT WINAPI
-StatusWindowProc (HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
-{
-    WND *wndPtr = WIN_FindWndPtr (hwnd);
-
-    switch (msg) {
-	case SB_GETBORDERS:
-	    return STATUSBAR_GetBorders (lParam);
-
-	case SB_GETICON:
-	    return STATUSBAR_GetIcon (wndPtr, wParam);
-
-	case SB_GETPARTS:
-	    return STATUSBAR_GetParts (wndPtr, wParam, lParam);
-
-	case SB_GETRECT:
-	    return STATUSBAR_GetRect (wndPtr, wParam, lParam);
-
-	case SB_GETTEXT32A:
-	    return STATUSBAR_GetText32A (wndPtr, wParam, lParam);
-
-//	case SB_GETTEXT32W:
-
-	case SB_GETTEXTLENGTH32A:
-	    return STATUSBAR_GetTextLength32A (wndPtr, wParam, lParam);
-
-//	case SB_GETTEXTLENGHT32W:
-
-	case SB_GETTIPTEXT32A:
-	    return STATUSBAR_GetTipText32A (wndPtr, wParam, lParam);
-
-//	case SB_GETTIPTEXT32W:
-//	case SB_GETUNICODEFORMAT:
-
-	case SB_ISSIMPLE:
-	    return STATUSBAR_IsSimple (wndPtr);
-
-	case SB_SETBKCOLOR:
-	    return STATUSBAR_SetBkColor (wndPtr, wParam, lParam);
-
-	case SB_SETICON:
-	    return STATUSBAR_SetIcon (wndPtr, wParam, lParam);
-
-	case SB_SETMINHEIGHT:
-	    return STATUSBAR_SetMinHeight (wndPtr, wParam, lParam);
-
-	case SB_SETPARTS:	
-	    return STATUSBAR_SetParts (wndPtr, wParam, lParam);
-
-	case SB_SETTEXT32A:
-	    return STATUSBAR_SetText32A (wndPtr, wParam, lParam);
-
-//	case SB_SETTEXT32W:
-
-	case SB_SETTIPTEXT32A:
-	    return STATUSBAR_SetTipText32A (wndPtr, wParam, lParam);
-
-//	case SB_SETTIPTEXT32W:
-//	case SB_SETUNICODEFORMAT:
-
-	case SB_SIMPLE:
-	    return STATUSBAR_Simple (wndPtr, wParam, lParam);
-
-
-	case WM_CREATE:
-	    return STATUSBAR_WMCreate (wndPtr, wParam, lParam);
-
-	case WM_DESTROY:
-	    return STATUSBAR_WMDestroy (wndPtr);
-
-	case WM_GETFONT:
-            return STATUSBAR_WMGetFont (wndPtr);
-
-	case WM_GETTEXT:
-            return STATUSBAR_WMGetText (wndPtr, wParam, lParam);
-
-	case WM_GETTEXTLENGTH:
-            return STATUSBAR_WMGetTextLength (wndPtr);
-
-	case WM_LBUTTONDBLCLK:
-            return STATUSBAR_SendNotify (wndPtr, NM_DBLCLK);
-
-	case WM_LBUTTONUP:
-	    return STATUSBAR_SendNotify (wndPtr, NM_CLICK);
-
-	case WM_MOUSEMOVE:
-            return STATUSBAR_WMMouseMove (wndPtr, wParam, lParam);
-
-	case WM_NCHITTEST:
-            return STATUSBAR_WMNCHitTest (wndPtr, wParam, lParam);
-
-	case WM_NCLBUTTONDOWN:
-	    return STATUSBAR_WMNCLButtonDown (wndPtr, wParam, lParam);
-
-	case WM_NCLBUTTONUP:
-	    return STATUSBAR_WMNCLButtonUp (wndPtr, wParam, lParam);
-
-	case WM_PAINT:
-	    return STATUSBAR_WMPaint (wndPtr, wParam);
-
-	case WM_RBUTTONDBLCLK:
-	    return STATUSBAR_SendNotify (wndPtr, NM_RDBLCLK);
-
-	case WM_RBUTTONUP:
-	    return STATUSBAR_SendNotify (wndPtr, NM_RCLICK);
-
-	case WM_SETFONT:
-	    return STATUSBAR_WMSetFont (wndPtr, wParam, lParam);
-
-	case WM_SETTEXT:
-	    return STATUSBAR_WMSetText (wndPtr, wParam, lParam);
-
-	case WM_SIZE:
-	    return STATUSBAR_WMSize (wndPtr, wParam, lParam);
-
-	default:
-	    if (msg >= WM_USER)
-		ERR (statusbar, "unknown msg %04x wp=%04x lp=%08lx\n",
-		     msg, wParam, lParam);
-	    return DefWindowProc32A (hwnd, msg, wParam, lParam);
-    }
-    return 0;
-}
-
-
-/***********************************************************************
- * STATUS_Register [Internal]
- *
- * Registers the status window class.
- */
-void STATUS_Register (void)
-{
-    WNDCLASS32A wndClass;
-
-    if (GlobalFindAtom32A (STATUSCLASSNAME32A)) return;
-
-    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
-    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW;
-    wndClass.lpfnWndProc   = (WNDPROC32)StatusWindowProc;
-    wndClass.cbClsExtra    = 0;
-    wndClass.cbWndExtra    = sizeof(STATUSWINDOWINFO *);
-    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
-    wndClass.hbrBackground = (HBRUSH32)(COLOR_3DFACE + 1);
-    wndClass.lpszClassName = STATUSCLASSNAME32A;
- 
-    RegisterClass32A (&wndClass);
-}
-
diff --git a/controls/toolbar.c b/controls/toolbar.c
deleted file mode 100644
index 142ffb6..0000000
--- a/controls/toolbar.c
+++ /dev/null
@@ -1,2641 +0,0 @@
-/*
- * Toolbar control
- *
- * Copyright 1998 Eric Kohl
- *
- * TODO:
- *   - Bitmap drawing.
- *   - Button wrapping.
- *   - Messages.
- *   - Notifications.
- *   - Fix TB_GETBITMAPFLAGS.
- *   - Fix TB_GETROWS and TB_SETROWS.
- *   - Tooltip support (almost complete).
- *   - Unicode suppport.
- *   - Internal COMMCTL32 bitmaps.
- *   - Fix TOOLBAR_Customize. (Customize dialog.)
- *
- * Testing:
- *   - Run tests using Waite Group Windows95 API Bible Volume 2.
- *     The second cdrom contains executables addstr.exe, btncount.exe,
- *     btnstate.exe, butstrsz.exe, chkbtn.exe, chngbmp.exe, customiz.exe,
- *     enablebtn.exe, getbmp.exe, getbtn.exe, getflags.exe, hidebtn.exe,
- *     indetbtn.exe, insbtn.exe, pressbtn.exe, setbtnsz.exe, setcmdid.exe,
- *     setparnt.exe, setrows.exe, toolwnd.exe.
- *   - Microsofts controlspy examples.
- */
-
-#include "windows.h"
-#include "commctrl.h"
-#include "cache.h"
-#include "toolbar.h"
-#include "heap.h"
-#include "win.h"
-#include "debug.h"
-
-
-#define SEPARATOR_WIDTH    8
-#define SEPARATOR_HEIGHT   5
-#define TOP_BORDER         2
-#define BOTTOM_BORDER      2
-
-
-
-#define TOOLBAR_GetInfoPtr(wndPtr) ((TOOLBAR_INFO *)wndPtr->wExtra[0])
-
-
-static void
-TOOLBAR_DrawFlatSeparator (LPRECT32 lpRect, HDC32 hdc)
-{
-    INT32 x = (lpRect->left + lpRect->right) / 2 - 1;
-    INT32 yBottom = lpRect->bottom - 3;
-    INT32 yTop = lpRect->top + 1;
-
-    SelectObject32 ( hdc, GetSysColorPen32 (COLOR_3DSHADOW));
-    MoveToEx32 (hdc, x, yBottom, NULL);
-    LineTo32 (hdc, x, yTop);
-    x++;
-    SelectObject32 ( hdc, GetSysColorPen32 (COLOR_3DHILIGHT));
-    MoveToEx32 (hdc, x, yBottom, NULL);
-    LineTo32 (hdc, x, yTop);
-}
-
-
-static void
-TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr,
-		    HDC32 hdc, INT32 nState)
-{
-    RECT32 rcText = btnPtr->rect;
-    HFONT32 hOldFont;
-    INT32   nOldBkMode;
-
-    /* draw text */
-    if ((btnPtr->iString > -1) && (btnPtr->iString < infoPtr->nNumStrings)) {
-
-	InflateRect32 (&rcText, -3, -3);
-	rcText.top += infoPtr->nBitmapHeight;
-	if (nState & (TBSTATE_PRESSED | TBSTATE_CHECKED))
-	    OffsetRect32 (&rcText, 1, 1);
-
-	hOldFont = SelectObject32 (hdc, infoPtr->hFont);
-	nOldBkMode = SetBkMode32 (hdc, TRANSPARENT);
-	if (!(nState & TBSTATE_ENABLED)) {
-	    COLORREF clrOld = 
-		SetTextColor32 (hdc, GetSysColor32 (COLOR_3DHILIGHT));
-	    OffsetRect32 (&rcText, 1, 1);
-	    DrawText32A (hdc, infoPtr->strings[btnPtr->iString], -1, &rcText,
-			 DT_CENTER);
-	    SetTextColor32 (hdc, GetSysColor32 (COLOR_3DSHADOW));
-	    OffsetRect32 (&rcText, -1, -1);
-	    DrawText32A (hdc, infoPtr->strings[btnPtr->iString], -1, &rcText,
-			 DT_CENTER);
-	    SetTextColor32 (hdc, clrOld);
-	}
-	else if (nState & TBSTATE_INDETERMINATE) {
-	    COLORREF clrOld = 
-		SetTextColor32 (hdc, GetSysColor32 (COLOR_3DSHADOW));
-	    DrawText32A (hdc, infoPtr->strings[btnPtr->iString], -1, &rcText,
-			 DT_CENTER);
-	    SetTextColor32 (hdc, clrOld);
-	}
-	else
-	    DrawText32A (hdc, infoPtr->strings[btnPtr->iString], -1, &rcText,
-			 DT_CENTER);
-
-	SelectObject32 (hdc, hOldFont);
-	if (nOldBkMode != TRANSPARENT)
-	    SetBkMode32 (hdc, nOldBkMode);
-    }
-}
-
-
-static void
-TOOLBAR_DrawButton (WND *wndPtr, TBUTTON_INFO *btnPtr, HDC32 hdc)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    BOOL32 bFlat = (wndPtr->dwStyle & TBSTYLE_FLAT);
-    RECT32 rc;
-
-    if (btnPtr->fsState & TBSTATE_HIDDEN) return;
-
-    rc = btnPtr->rect;
-    if (btnPtr->fsStyle & TBSTYLE_SEP) {
-	if ((bFlat) && (btnPtr->idCommand == 0))
-	    TOOLBAR_DrawFlatSeparator (&btnPtr->rect, hdc);
-	return;
-    }
-
-    /* disabled */
-    if (!(btnPtr->fsState & TBSTATE_ENABLED)) {
-	HICON32 hIcon;
-	DrawEdge32 (hdc, &rc, EDGE_RAISED,
-		    BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
-
-//	ImageList_Draw (infoPtr->himlDis, btnPtr->iBitmap, hdc,
-//			rc.left+1, rc.top+1, ILD_NORMAL);
-	TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
-	return;
-    }
-
-    /* pressed TBSTYLE_BUTTON */
-    if (btnPtr->fsState & TBSTATE_PRESSED) {
-	DrawEdge32 (hdc, &rc, EDGE_SUNKEN,
-		    BF_RECT | BF_MIDDLE | BF_ADJUST);
-	ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
-			rc.left+2, rc.top+2, ILD_NORMAL);
-	TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
-	return;
-    }
-
-    /* checked TBSTYLE_CHECK*/
-    if ((btnPtr->fsStyle & TBSTYLE_CHECK) &&
-	(btnPtr->fsState & TBSTATE_CHECKED)) {
-	HBRUSH32 hbr;
-	DrawEdge32 (hdc, &rc, EDGE_SUNKEN,
-		    BF_RECT | BF_MIDDLE | BF_ADJUST);
-
-	hbr = SelectObject32 (hdc, CACHE_GetPattern55AABrush ());
-	PatBlt32 (hdc, rc.left, rc.top, rc.right - rc.left,
-		  rc.bottom - rc.top, 0x00FA0089);
-	SelectObject32 (hdc, hbr);
-	ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
-			rc.left+2, rc.top+2, ILD_NORMAL);
-	TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
-	return;
-    }
-
-    /* indeterminate */	
-    if (btnPtr->fsState & TBSTATE_INDETERMINATE) {
-	HBRUSH32 hbr;
-	DrawEdge32 (hdc, &rc, EDGE_RAISED,
-		    BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
-
-	hbr = SelectObject32 (hdc, CACHE_GetPattern55AABrush ());
-	PatBlt32 (hdc, rc.left, rc.top, rc.right - rc.left,
-		  rc.bottom - rc.top, 0x00FA0089);
-	SelectObject32 (hdc, hbr);
-//	ImageList_Draw (infoPtr->himlDis, btnPtr->iBitmap, hdc,
-//			rc.left+1, rc.top+1, ILD_NORMAL);
-	TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
-	return;
-    }
-
-    /* normal state */
-    DrawEdge32 (hdc, &rc, EDGE_RAISED,
-		BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
-    ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
-		    rc.left+1, rc.top+1, ILD_NORMAL);
-    TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
-}
-
-
-static void
-TOOLBAR_Refresh (WND *wndPtr, HDC32 hdc)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    INT32 i;
-
-    /* draw buttons */
-    btnPtr = infoPtr->buttons;
-    for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++)
-	TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
-}
-
-
-static void
-TOOLBAR_CalcStrings (WND *wndPtr, LPSIZE32 lpSize)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    INT32 i;
-    HDC32 hdc;
-    HFONT32 hOldFont;
-    SIZE32 sz;
-
-    lpSize->cx = 0;
-    lpSize->cy = 0;
-    hdc = GetDC32 (0);
-    hOldFont = SelectObject32 (hdc, infoPtr->hFont);
-
-    btnPtr = infoPtr->buttons;
-    for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
-	if (!(btnPtr->fsState & TBSTATE_HIDDEN) &&
-	    (btnPtr->iString > -1) &&
-	    (btnPtr->iString < infoPtr->nNumStrings)) {
-	    LPSTR lpText = infoPtr->strings[btnPtr->iString];
-	    GetTextExtentPoint32A (hdc, lpText, lstrlen32A(lpText), &sz);
-	    if (sz.cx > lpSize->cx)
-		lpSize->cx = sz.cx;
-	    if (sz.cy > lpSize->cy)
-		lpSize->cy = sz.cy;
-	}
-    }
-
-    SelectObject32 (hdc, hOldFont);
-    ReleaseDC32 (0, hdc);
-
-    TRACE (toolbar, "string size %d x %d!\n", lpSize->cx, lpSize->cy);
-}
-
-
-static void
-TOOLBAR_CalcToolbar (WND *wndPtr)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    INT32 i, j, nRows;
-    INT32 x, y, cx, cy;
-    BOOL32 bVertical;
-    SIZE32  sizeString;
-    RECT32 rect = {0, 0, 0, 0};
-
-    TOOLBAR_CalcStrings (wndPtr, &sizeString);
-
-    if (sizeString.cy > 0)
-	infoPtr->nButtonHeight = sizeString.cy + infoPtr->nBitmapHeight + 6;
-    else if (infoPtr->nButtonHeight < infoPtr->nBitmapHeight + 6)
-	infoPtr->nButtonHeight = infoPtr->nBitmapHeight + 6;
-
-    if (sizeString.cx > infoPtr->nBitmapWidth)
-	infoPtr->nButtonWidth = sizeString.cx + 6;
-    else if (infoPtr->nButtonWidth < infoPtr->nBitmapWidth + 6)
-	infoPtr->nButtonWidth = infoPtr->nBitmapWidth + 6;
-
-    x  = infoPtr->nIndent;
-    y  = TOP_BORDER;
-    cx = infoPtr->nButtonWidth;
-    cy = infoPtr->nButtonHeight;
-    nRows = 1;
-    rect.top = y;
-    rect.left = x;
-    rect.bottom = y + cy;
-    rect.right = x;
-
-    btnPtr = infoPtr->buttons;
-    for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
-	bVertical = FALSE;
-
-	if (btnPtr->fsState & TBSTATE_HIDDEN)
-	    continue;
-
-	if (btnPtr->fsStyle & TBSTYLE_SEP) {
-	    /* UNDOCUMENTED: If a separator has a non zero bitmap index, */
-	    /* it is the actual width of the separator. This is used for */
-	    /* custom controls in toolbars.                              */
-	    if ((wndPtr->dwStyle & TBSTYLE_WRAPABLE) &&
-		(btnPtr->fsState & TBSTATE_WRAP)) {
-		x = 0;
-		y += cy;
-		cx = infoPtr->nWidth;
-		cy = ((btnPtr->iBitmap > 0) ?
-		     btnPtr->iBitmap : SEPARATOR_WIDTH) * 2 / 3;
-		nRows++;
-		bVertical = TRUE;
-	    }
-	    else
-		cx = (btnPtr->iBitmap > 0) ?
-		     btnPtr->iBitmap : SEPARATOR_WIDTH;
-	}
-	else {
-	    /* this must be a button */
-	    cx = infoPtr->nButtonWidth;
-
-	}
-
-	btnPtr->rect.left   = x;
-	btnPtr->rect.top    = y;
-	btnPtr->rect.right  = x + cx;
-	btnPtr->rect.bottom = y + cy;
-
-	if (rect.left > x)
-	    rect.left = x;
-	if (rect.right < x + cx)
-	    rect.right = x + cx;
-	if (rect.bottom < y + cy)
-	    rect.bottom = y + cy;
-
-	if (infoPtr->hwndToolTip) {
-	    TTTOOLINFO32A ti;
-
-	    ZeroMemory (&ti, sizeof(TTTOOLINFO32A));
-	    ti.cbSize = sizeof(TTTOOLINFO32A);
-	    ti.hwnd = wndPtr->hwndSelf;
-	    ti.uId = btnPtr->idCommand;
-	    ti.rect = btnPtr->rect;
-	    SendMessage32A (infoPtr->hwndToolTip, TTM_NEWTOOLRECT32A,
-			    0, (LPARAM)&ti);
-	}
-
-	if (bVertical) {
-	    x = 0;
-	    y += cy;
-	    if (i < infoPtr->nNumButtons)
-		nRows++;
-	}
-	else
-	    x += cx;
-    }
-
-    infoPtr->nHeight = y + cy + BOTTOM_BORDER;
-    infoPtr->maxSize.cx = rect.right - rect.left;
-    infoPtr->maxSize.cy = rect.bottom - rect.top;
-    TRACE (toolbar, "toolbar height %d\n", infoPtr->nHeight);
-}
-
-
-static INT32
-TOOLBAR_InternalHitTest (WND *wndPtr, LPPOINT32 lpPt)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    INT32 i;
-    
-    btnPtr = infoPtr->buttons;
-    for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
-	if (btnPtr->fsState & TBSTATE_HIDDEN)
-	    continue;
-
-	if (btnPtr->fsStyle & TBSTYLE_SEP) {
-	    if (PtInRect32 (&btnPtr->rect, *lpPt)) {
-		TRACE (toolbar, " ON SEPARATOR %d!\n", i);
-		return -i;
-	    }
-	}
-	else {
-	    if (PtInRect32 (&btnPtr->rect, *lpPt)) {
-		TRACE (toolbar, " ON BUTTON %d!\n", i);
-		return i;
-	    }
-	}
-    }
-
-    TRACE (toolbar, " NOWHERE!\n");
-    return -1;
-}
-
-
-static INT32
-TOOLBAR_GetButtonIndex (TOOLBAR_INFO *infoPtr, INT32 idCommand)
-{
-    TBUTTON_INFO *btnPtr;
-    INT32 i;
-
-    btnPtr = infoPtr->buttons;
-    for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
-	if (btnPtr->idCommand == idCommand) {
-	    TRACE (toolbar, "command=%d index=%d\n", idCommand, i);
-	    return i;
-	}
-    }
-    TRACE (toolbar, "no index found for command=%d\n", idCommand);
-    return -1;
-}
-
-
-static INT32
-TOOLBAR_GetCheckedGroupButtonIndex (TOOLBAR_INFO *infoPtr, INT32 nIndex)
-{
-    TBUTTON_INFO *btnPtr;
-    INT32 nRunIndex;
-
-    if ((nIndex < 0) || (nIndex > infoPtr->nNumButtons))
-	return -1;
-
-    /* check index button */
-    btnPtr = &infoPtr->buttons[nIndex];
-    if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {
-	if (btnPtr->fsState & TBSTATE_CHECKED)
-	    return nIndex;
-    }
-
-    /* check previous buttons */
-    nRunIndex = nIndex - 1;
-    while (nRunIndex >= 0) {
-	btnPtr = &infoPtr->buttons[nRunIndex];
-	if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {
-	    if (btnPtr->fsState & TBSTATE_CHECKED)
-		return nRunIndex;
-	}
-	else
-	    break;
-	nRunIndex--;
-    }
-
-    /* check next buttons */
-    nRunIndex = nIndex + 1;
-    while (nRunIndex < infoPtr->nNumButtons) {
-	btnPtr = &infoPtr->buttons[nRunIndex];	
-	if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {
-	    if (btnPtr->fsState & TBSTATE_CHECKED)
-		return nRunIndex;
-	}
-	else
-	    break;
-	nRunIndex++;
-    }
-
-    return -1;
-}
-
-
-static VOID
-TOOLBAR_RelayEvent (HWND32 hwndTip, HWND32 hwndMsg, UINT32 uMsg,
-		    WPARAM32 wParam, LPARAM lParam)
-{
-    MSG32 msg;
-
-    msg.hwnd = hwndMsg;
-    msg.message = uMsg;
-    msg.wParam = wParam;
-    msg.lParam = lParam;
-    msg.time = GetMessageTime ();
-    msg.pt.x = LOWORD(GetMessagePos ());
-    msg.pt.y = HIWORD(GetMessagePos ());
-
-    SendMessage32A (hwndTip, TTM_RELAYEVENT, 0, (LPARAM)&msg);
-}
-
-
-static LRESULT
-TOOLBAR_AddBitmap (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    LPTBADDBITMAP lpAddBmp = (LPTBADDBITMAP)lParam;
-    INT32 nIndex = 0;
-
-    if ((!lpAddBmp) || ((INT32)wParam <= 0))
-	return -1;
-
-    TRACE (toolbar, "adding %d bitmaps!\n", wParam);
-
-    if (!(infoPtr->himlDef)) {
-	/* create new default image list */
-	TRACE (toolbar, "creating default image list!\n");
-	infoPtr->himlDef =
-	    ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight,
-			      ILC_COLOR | ILC_MASK, (INT32)wParam, 2);
-    }
-
-#if 0
-    if (!(infoPtr->himlDis)) {
-	/* create new disabled image list */
-	TRACE (toolbar, "creating disabled image list!\n");
-	infoPtr->himlDis =
-	    ImageList_Create (infoPtr->nBitmapWidth, 
-			      infoPtr->nBitmapHeight, ILC_COLOR | ILC_MASK,
-			      (INT32)wParam, 2);
-    }
-#endif
-
-    /* Add bitmaps to the default image list */
-    if (lpAddBmp->hInst == (HINSTANCE32)0) {
-	nIndex = 
-	    ImageList_AddMasked (infoPtr->himlDef, (HBITMAP32)lpAddBmp->nID,
-				 GetSysColor32 (COLOR_3DFACE));
-    }
-    else if (lpAddBmp->hInst == HINST_COMMCTRL) {
-	/* add internal bitmaps */
-	FIXME (toolbar, "internal bitmaps not supported!\n");
-
-	/* Hack to "add" some reserved images within the image list 
-	   to get the right image indices */
-	nIndex = ImageList_GetImageCount (infoPtr->himlDef);
-	ImageList_SetImageCount (infoPtr->himlDef, nIndex + (INT32)wParam);
-    }
-    else {
-	HBITMAP32 hBmp =
-	    LoadBitmap32A (lpAddBmp->hInst, (LPSTR)lpAddBmp->nID);
-
-	nIndex = ImageList_Add (infoPtr->himlDef, hBmp, (HBITMAP32)0);
-
-	DeleteObject32 (hBmp); 
-    }
-
-
-    infoPtr->nNumBitmaps += (INT32)wParam;
-
-    return nIndex;
-}
-
-
-static LRESULT
-TOOLBAR_AddButtons32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
-    INT32 nOldButtons, nNewButtons, nAddButtons, nCount;
-    HDC32 hdc;
-
-    TRACE (toolbar, "adding %d buttons!\n", wParam);
-
-    nAddButtons = (UINT32)wParam;
-    nOldButtons = infoPtr->nNumButtons;
-    nNewButtons = nOldButtons + nAddButtons;
-
-    if (infoPtr->nNumButtons == 0) {
-	infoPtr->buttons =
-	    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-		       sizeof (TBUTTON_INFO) * nNewButtons);
-    }
-    else {
-	TBUTTON_INFO *oldButtons = infoPtr->buttons;
-	infoPtr->buttons =
-	    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-		       sizeof (TBUTTON_INFO) * nNewButtons);
-	memcpy (&infoPtr->buttons[0], &oldButtons[0],
-		nOldButtons * sizeof(TBUTTON_INFO));
-        HeapFree (GetProcessHeap (), 0, oldButtons);
-    }
-
-    infoPtr->nNumButtons = nNewButtons;
-
-    /* insert new button data (bad implementation)*/
-    for (nCount = 0; nCount < nAddButtons; nCount++) {
-	infoPtr->buttons[nOldButtons+nCount].iBitmap   = lpTbb[nCount].iBitmap;
-	infoPtr->buttons[nOldButtons+nCount].idCommand = lpTbb[nCount].idCommand;
-	infoPtr->buttons[nOldButtons+nCount].fsState   = lpTbb[nCount].fsState;
-	infoPtr->buttons[nOldButtons+nCount].fsStyle   = lpTbb[nCount].fsStyle;
-	infoPtr->buttons[nOldButtons+nCount].dwData    = lpTbb[nCount].dwData;
-	infoPtr->buttons[nOldButtons+nCount].iString   = lpTbb[nCount].iString;
-
-	if ((infoPtr->hwndToolTip) && !(lpTbb[nCount].fsStyle & TBSTYLE_SEP)) {
-	    TTTOOLINFO32A ti;
-
-	    ZeroMemory (&ti, sizeof(TTTOOLINFO32A));
-	    ti.cbSize   = sizeof (TTTOOLINFO32A);
-	    ti.hwnd     = wndPtr->hwndSelf;
-	    ti.uId      = lpTbb[nCount].idCommand;
-	    ti.hinst    = 0;
-	    ti.lpszText = LPSTR_TEXTCALLBACK32A;
-
-	    SendMessage32A (infoPtr->hwndToolTip, TTM_ADDTOOL32A,
-			    0, (LPARAM)&ti);
-	}
-    }
-
-    TOOLBAR_CalcToolbar (wndPtr);
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    TOOLBAR_Refresh (wndPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return TRUE;
-}
-
-
-// << TOOLBAR_AddButtons32W >>
-
-
-static LRESULT
-TOOLBAR_AddString32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    INT32 nIndex;
-
-    if (wParam) {
-	char szString[256];
-	INT32 len;
-	TRACE (toolbar, "adding string from resource!\n");
-
-	len = LoadString32A ((HINSTANCE32)wParam, (UINT32)lParam,
-			     szString, 256);
-
-	TRACE (toolbar, "len=%d \"%s\"\n", len, szString);
-	nIndex = infoPtr->nNumStrings;
-	if (infoPtr->nNumStrings == 0) {
-	    infoPtr->strings =
-		HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(char *));
-	}
-	else {
-	    char **oldStrings = infoPtr->strings;
-	    infoPtr->strings =
-		HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-			   sizeof(char *) * (infoPtr->nNumStrings + 1));
-	    memcpy (&infoPtr->strings[0], &oldStrings[0],
-		    sizeof(char *) * infoPtr->nNumStrings);
-	    HeapFree (GetProcessHeap (), 0, oldStrings);
-	}
-
-	infoPtr->strings[infoPtr->nNumStrings] =
-	    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(char)*(len+1));
-	lstrcpy32A (infoPtr->strings[infoPtr->nNumStrings], szString);
-	infoPtr->nNumStrings++;
-    }
-    else {
-	char *p = (char*)lParam;
-	INT32 len;
-
-	if (p == NULL) return -1;
-	TRACE (toolbar, "adding string(s) from array!\n");
-	nIndex = infoPtr->nNumStrings;
-	while (*p) {
-	    len = lstrlen32A (p);
-	    TRACE (toolbar, "len=%d \"%s\"\n", len, p);
-
-	    if (infoPtr->nNumStrings == 0) {
-		infoPtr->strings =
-		    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(char *));
-	    }
-	    else {
-		char **oldStrings = infoPtr->strings;
-		infoPtr->strings =
-		    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-			       sizeof(char *) * (infoPtr->nNumStrings + 1));
-		memcpy (&infoPtr->strings[0], &oldStrings[0],
-			sizeof(char *) * infoPtr->nNumStrings);
-		HeapFree (GetProcessHeap (), 0, oldStrings);
-	    }
-
-	    infoPtr->strings[infoPtr->nNumStrings] =
-		HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(char)*(len+1));
-	    lstrcpy32A (infoPtr->strings[infoPtr->nNumStrings], p);
-	    infoPtr->nNumStrings++;
-
-	    p += (len+1);
-	}
-    }
-
-    return nIndex;
-}
-
-
-// << TOOLBAR_AddString32W >>
-
-
-static LRESULT
-TOOLBAR_AutoSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    RECT32 parent_rect;
-    HWND32 parent;
-    INT32  x, y, cx, cy;
-    UINT32 uPosFlags = 0;
-
-    TRACE (toolbar, "resizing!\n");
-
-    parent = GetParent32 (wndPtr->hwndSelf);
-    GetClientRect32(parent, &parent_rect);
-
-    if (wndPtr->dwStyle & CCS_NORESIZE) {
-	uPosFlags |= SWP_NOSIZE;
-	cx = 0;
-	cy = 0;
-    }
-    else {
-	infoPtr->nWidth = parent_rect.right - parent_rect.left;
-	TOOLBAR_CalcToolbar (wndPtr);
-	cy = infoPtr->nHeight;
-	cx = infoPtr->nWidth;
-    }
-
-    if (wndPtr->dwStyle & CCS_NOPARENTALIGN)
-	uPosFlags |= SWP_NOMOVE;
-
-    if (!(wndPtr->dwStyle & CCS_NODIVIDER))
-	cy += 2;
-
-    infoPtr->bAutoSize = TRUE;
-    SetWindowPos32 (wndPtr->hwndSelf, HWND_TOP, parent_rect.left, parent_rect.top,
-		    cx, cy, uPosFlags);
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLBAR_ButtonCount (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    return infoPtr->nNumButtons;
-}
-
-
-static LRESULT
-TOOLBAR_ButtonStructSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    if (infoPtr == NULL) {
-	ERR (toolbar, "(0x%08lx, 0x%08x, 0x%08lx)\n", (DWORD)wndPtr, wParam, lParam);
-	ERR (toolbar, "infoPtr == NULL!\n");
-	return 0;
-    }
-
-    infoPtr->dwStructSize = (DWORD)wParam;
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLBAR_ChangeBitmap (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    HDC32 hdc;
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return FALSE;
-
-    btnPtr = &infoPtr->buttons[nIndex];
-    btnPtr->iBitmap = LOWORD(lParam);
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return TRUE;
-}
-
-
-static LRESULT
-TOOLBAR_CheckButton (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    HDC32 hdc;
-    INT32 nIndex;
-    INT32 nOldIndex = -1;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return FALSE;
-
-    btnPtr = &infoPtr->buttons[nIndex];
-
-    if (!(btnPtr->fsStyle & TBSTYLE_CHECK))
-	return FALSE;
-
-    if (LOWORD(lParam) == FALSE)
-	btnPtr->fsState &= ~TBSTATE_CHECKED;
-    else {
-	if (btnPtr->fsStyle & TBSTYLE_GROUP) {
-	    nOldIndex = 
-		TOOLBAR_GetCheckedGroupButtonIndex (infoPtr, nIndex);
-	    if (nOldIndex == nIndex)
-		return 0;
-	    if (nOldIndex != -1)
-		infoPtr->buttons[nOldIndex].fsState &= ~TBSTATE_CHECKED;
-	}
-	btnPtr->fsState |= TBSTATE_CHECKED;
-    }
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    if (nOldIndex != -1)
-	TOOLBAR_DrawButton (wndPtr, &infoPtr->buttons[nOldIndex], hdc);
-    TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    /* FIXME: Send a WM_NOTIFY?? */
-
-    return TRUE;
-}
-
-
-static LRESULT
-TOOLBAR_CommandToIndex (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    return TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-}
-
-
-static LRESULT
-TOOLBAR_Customize (WND *wndPtr)
-{
-    FIXME (toolbar, "customization not implemented!\n");
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLBAR_DeleteButton (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    INT32 nIndex = (INT32)wParam;
-
-    if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
-	return FALSE;
-
-    if ((infoPtr->hwndToolTip) && 
-	!(infoPtr->buttons[nIndex].fsStyle & TBSTYLE_SEP)) {
-	TTTOOLINFO32A ti;
-
-	ZeroMemory (&ti, sizeof(TTTOOLINFO32A));
-	ti.cbSize   = sizeof (TTTOOLINFO32A);
-	ti.hwnd     = wndPtr->hwndSelf;
-	ti.uId      = infoPtr->buttons[nIndex].idCommand;
-
-	SendMessage32A (infoPtr->hwndToolTip, TTM_DELTOOL32A, 0, (LPARAM)&ti);
-    }
-
-    if (infoPtr->nNumButtons == 1) {
-	TRACE (toolbar, " simple delete!\n");
-	HeapFree (GetProcessHeap (), 0, infoPtr->buttons);
-	infoPtr->buttons = NULL;
-	infoPtr->nNumButtons = 0;
-    }
-    else {
-	TBUTTON_INFO *oldButtons = infoPtr->buttons;
-        TRACE(toolbar, "complex delete! [nIndex=%d]\n", nIndex);
-
-	infoPtr->nNumButtons--;
-	infoPtr->buttons = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-				      sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);
-        if (nIndex > 0) {
-            memcpy (&infoPtr->buttons[0], &oldButtons[0],
-                    nIndex * sizeof(TBUTTON_INFO));
-        }
-
-        if (nIndex < infoPtr->nNumButtons) {
-            memcpy (&infoPtr->buttons[nIndex], &oldButtons[nIndex+1],
-                    (infoPtr->nNumButtons - nIndex) * sizeof(TBUTTON_INFO));
-        }
-
-        HeapFree (GetProcessHeap (), 0, oldButtons);
-    }
-
-    TOOLBAR_CalcToolbar (wndPtr);
-
-    InvalidateRect32 (wndPtr->hwndSelf, NULL, TRUE);
-    UpdateWindow32 (wndPtr->hwndSelf);
-
-    return TRUE;
-}
-
-
-static LRESULT
-TOOLBAR_EnableButton (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    HDC32 hdc;
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return FALSE;
-
-    btnPtr = &infoPtr->buttons[nIndex];
-    if (LOWORD(lParam) == FALSE)
-	btnPtr->fsState &= ~(TBSTATE_ENABLED | TBSTATE_PRESSED);
-    else
-	btnPtr->fsState |= TBSTATE_ENABLED;
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return TRUE;
-}
-
-
-// << TOOLBAR_GetAnchorHighlight >>
-
-
-static LRESULT
-TOOLBAR_GetBitmap (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return 0;
-
-    return infoPtr->buttons[nIndex].iBitmap;
-}
-
-
-static LRESULT
-TOOLBAR_GetBitmapFlags (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    FIXME (toolbar, "stub!\n");
-    return 0;
-}
-
-
-static LRESULT
-TOOLBAR_GetButton (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
-    INT32 nIndex = (INT32)wParam;
-    TBUTTON_INFO *btnPtr;
-
-    if (infoPtr == NULL) return FALSE;
-    if (lpTbb == NULL) return FALSE;
-
-    if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
-	return FALSE;
-
-    btnPtr = &infoPtr->buttons[nIndex];
-    lpTbb->iBitmap   = btnPtr->iBitmap;
-    lpTbb->idCommand = btnPtr->idCommand;
-    lpTbb->fsState   = btnPtr->fsState;
-    lpTbb->fsStyle   = btnPtr->fsStyle;
-    lpTbb->dwData    = btnPtr->dwData;
-    lpTbb->iString   = btnPtr->iString;
-
-    return TRUE;
-}
-
-
-static LRESULT
-TOOLBAR_GetButtonInfo32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    LPTBBUTTONINFO32A lpTbInfo = (LPTBBUTTONINFO32A)lParam;
-    TBUTTON_INFO *btnPtr;
-    INT32 nIndex;
-
-    if (infoPtr == NULL) return -1;
-    if (lpTbInfo == NULL) return -1;
-    if (lpTbInfo->cbSize < sizeof(LPTBBUTTONINFO32A)) return -1;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-
-    if (nIndex == -1)
-	return -1;
-
-    btnPtr = &infoPtr->buttons[nIndex];
-
-    if (lpTbInfo->dwMask & TBIF_COMMAND)
-	lpTbInfo->idCommand = btnPtr->idCommand;
-
-    if (lpTbInfo->dwMask & TBIF_IMAGE)
-	lpTbInfo->iImage = btnPtr->iBitmap;
-
-    if (lpTbInfo->dwMask & TBIF_LPARAM)
-	lpTbInfo->lParam = btnPtr->dwData;
-
-    if (lpTbInfo->dwMask & TBIF_SIZE)
-	lpTbInfo->cx = (WORD)(btnPtr->rect.right - btnPtr->rect.left);
-
-    if (lpTbInfo->dwMask & TBIF_STATE)
-	lpTbInfo->fsState = btnPtr->fsState;
-
-    if (lpTbInfo->dwMask & TBIF_STYLE)
-	lpTbInfo->fsStyle = btnPtr->fsStyle;
-
-    if (lpTbInfo->dwMask & TBIF_TEXT) {
-	if ((btnPtr->iString >= 0) || (btnPtr->iString < infoPtr->nNumStrings))
-	    lstrcpyn32A (lpTbInfo->pszText, 
-			 (LPSTR)infoPtr->strings[btnPtr->iString],
-			 lpTbInfo->cchText);
-    }
-
-    return nIndex;
-}
-
-
-// << TOOLBAR_GetButtonInfo32W >>
-
-
-static LRESULT
-TOOLBAR_GetButtonSize (WND *wndPtr)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    return MAKELONG((WORD)infoPtr->nButtonWidth,
-		    (WORD)infoPtr->nButtonHeight);
-}
-
-
-static LRESULT
-TOOLBAR_GetButtonText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    INT32 nIndex, nStringIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return -1;
-
-    nStringIndex = infoPtr->buttons[nIndex].iString;
-
-    TRACE (toolbar, "index=%d stringIndex=%d\n", nIndex, nStringIndex);
-
-    if ((nStringIndex < 0) || (nStringIndex >= infoPtr->nNumStrings))
-	return -1;
-
-    if (lParam == 0) return -1;
-
-    lstrcpy32A ((LPSTR)lParam, (LPSTR)infoPtr->strings[nStringIndex]);
-
-    return lstrlen32A ((LPSTR)infoPtr->strings[nStringIndex]);
-}
-
-
-// << TOOLBAR_GetButtonText32W >>
-// << TOOLBAR_GetColorScheme >>
-
-
-static LRESULT
-TOOLBAR_GetDisabledImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    if (wndPtr->dwStyle & TBSTYLE_FLAT)
-	return (LRESULT)infoPtr->himlDis;
-    else
-	return 0;
-}
-
-
-__inline__ static LRESULT
-TOOLBAR_GetExtendedStyle (WND *wndPtr)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    return infoPtr->dwExStyle;
-}
-
-
-static LRESULT
-TOOLBAR_GetHotImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    if (wndPtr->dwStyle & TBSTYLE_FLAT)
-	return (LRESULT)infoPtr->himlHot;
-    else
-	return 0;
-}
-
-
-// << TOOLBAR_GetHotItem >>
-
-
-static LRESULT
-TOOLBAR_GetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    if (wndPtr->dwStyle & TBSTYLE_FLAT)
-	return (LRESULT)infoPtr->himlDef;
-    else
-	return 0;
-}
-
-
-// << TOOLBAR_GetInsertMark >>
-// << TOOLBAR_GetInsertMarkColor >>
-
-
-static LRESULT
-TOOLBAR_GetItemRect (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    LPRECT32     lpRect;
-    INT32        nIndex;
-
-    if (infoPtr == NULL) return FALSE;
-    nIndex = (INT32)wParam;
-    btnPtr = &infoPtr->buttons[nIndex];
-    if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
-	return FALSE;
-    lpRect = (LPRECT32)lParam;
-    if (lpRect == NULL) return FALSE;
-    if (btnPtr->fsState & TBSTATE_HIDDEN) return FALSE;
-    
-    lpRect->left   = btnPtr->rect.left;
-    lpRect->right  = btnPtr->rect.right;
-    lpRect->bottom = btnPtr->rect.bottom;
-    lpRect->top    = btnPtr->rect.top;
-
-    return TRUE;
-}
-
-
-static LRESULT
-TOOLBAR_GetMaxSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    LPSIZE32 lpSize = (LPSIZE32)lParam;
-
-    if (lpSize == NULL)
-	return FALSE;
-
-    lpSize->cx = infoPtr->maxSize.cx;
-    lpSize->cx = infoPtr->maxSize.cy;
-
-    TRACE (toolbar, "maximum size %d x %d\n",
-	   infoPtr->maxSize.cx, infoPtr->maxSize.cy);
-
-    return TRUE;
-}
-
-
-// << TOOLBAR_GetObject >>
-// << TOOLBAR_GetPadding >>
-
-
-static LRESULT
-TOOLBAR_GetRect (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    LPRECT32     lpRect;
-    INT32        nIndex;
-
-    if (infoPtr == NULL) return FALSE;
-    nIndex = (INT32)wParam;
-    btnPtr = &infoPtr->buttons[nIndex];
-    if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
-	return FALSE;
-    lpRect = (LPRECT32)lParam;
-    if (lpRect == NULL) return FALSE;
-    
-    lpRect->left   = btnPtr->rect.left;
-    lpRect->right  = btnPtr->rect.right;
-    lpRect->bottom = btnPtr->rect.bottom;
-    lpRect->top    = btnPtr->rect.top;
-
-    return TRUE;
-}
-
-
-static LRESULT
-TOOLBAR_GetRows (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    if (wndPtr->dwStyle & TBSTYLE_WRAPABLE)
-	return infoPtr->nMaxRows;
-    else
-	return 1;
-}
-
-
-static LRESULT
-TOOLBAR_GetState (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1) return -1;
-
-    return infoPtr->buttons[nIndex].fsState;
-}
-
-
-static LRESULT
-TOOLBAR_GetStyle (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1) return -1;
-
-    return infoPtr->buttons[nIndex].fsStyle;
-}
-
-
-static LRESULT
-TOOLBAR_GetTextRows (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    if (infoPtr == NULL)
-	return 0;
-
-    return infoPtr->nMaxTextRows;
-}
-
-
-static LRESULT
-TOOLBAR_GetToolTips (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    if (infoPtr == NULL) return 0;
-    return infoPtr->hwndToolTip;
-}
-
-
-static LRESULT
-TOOLBAR_GetUnicodeFormat (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    TRACE (toolbar, "%s hwnd=0x%04x stub!\n", 
-	   infoPtr->bUnicode ? "TRUE" : "FALSE", wndPtr->hwndSelf);
-
-    return infoPtr->bUnicode;
-}
-
-
-static LRESULT
-TOOLBAR_HideButton (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return FALSE;
-
-    btnPtr = &infoPtr->buttons[nIndex];
-    if (LOWORD(lParam) == FALSE)
-	btnPtr->fsState &= ~TBSTATE_HIDDEN;
-    else
-	btnPtr->fsState |= TBSTATE_HIDDEN;
-
-    TOOLBAR_CalcToolbar (wndPtr);
-
-    InvalidateRect32 (wndPtr->hwndSelf, NULL, TRUE);
-    UpdateWindow32 (wndPtr->hwndSelf);
-
-    return TRUE;
-}
-
-
-__inline__ static LRESULT
-TOOLBAR_HitTest (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    return TOOLBAR_InternalHitTest (wndPtr, (LPPOINT32)lParam);
-}
-
-
-static LRESULT
-TOOLBAR_Indeterminate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    HDC32 hdc;
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return FALSE;
-
-    btnPtr = &infoPtr->buttons[nIndex];
-    if (LOWORD(lParam) == FALSE)
-	btnPtr->fsState &= ~TBSTATE_INDETERMINATE;
-    else
-	btnPtr->fsState |= TBSTATE_INDETERMINATE;
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return TRUE;
-}
-
-
-static LRESULT
-TOOLBAR_InsertButton32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
-    INT32 nIndex = (INT32)wParam;
-    TBUTTON_INFO *oldButtons;
-    HDC32 hdc;
-
-    if (lpTbb == NULL) return FALSE;
-    if (nIndex < 0) return FALSE;
-
-    TRACE (toolbar, "inserting button index=%d\n", nIndex);
-    if (nIndex > infoPtr->nNumButtons) {
-	nIndex = infoPtr->nNumButtons;
-	TRACE (toolbar, "adjust index=%d\n", nIndex);
-    }
-
-    oldButtons = infoPtr->buttons;
-    infoPtr->nNumButtons++;
-    infoPtr->buttons = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-				  sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);
-    /* pre insert copy */
-    if (nIndex > 0) {
-	memcpy (&infoPtr->buttons[0], &oldButtons[0],
-		nIndex * sizeof(TBUTTON_INFO));
-    }
-
-    /* insert new button */
-    infoPtr->buttons[nIndex].iBitmap   = lpTbb->iBitmap;
-    infoPtr->buttons[nIndex].idCommand = lpTbb->idCommand;
-    infoPtr->buttons[nIndex].fsState   = lpTbb->fsState;
-    infoPtr->buttons[nIndex].fsStyle   = lpTbb->fsStyle;
-    infoPtr->buttons[nIndex].dwData    = lpTbb->dwData;
-    infoPtr->buttons[nIndex].iString   = lpTbb->iString;
-
-    if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & TBSTYLE_SEP)) {
-	TTTOOLINFO32A ti;
-
-	ZeroMemory (&ti, sizeof(TTTOOLINFO32A));
-	ti.cbSize   = sizeof (TTTOOLINFO32A);
-	ti.hwnd     = wndPtr->hwndSelf;
-	ti.uId      = lpTbb->idCommand;
-	ti.hinst    = 0;
-	ti.lpszText = LPSTR_TEXTCALLBACK32A;
-
-	SendMessage32A (infoPtr->hwndToolTip, TTM_ADDTOOL32A,
-			0, (LPARAM)&ti);
-    }
-
-    /* post insert copy */
-    if (nIndex < infoPtr->nNumButtons - 1) {
-	memcpy (&infoPtr->buttons[nIndex+1], &oldButtons[nIndex],
-		(infoPtr->nNumButtons - nIndex - 1) * sizeof(TBUTTON_INFO));
-    }
-
-    HeapFree (GetProcessHeap (), 0, oldButtons);
-
-    TOOLBAR_CalcToolbar (wndPtr);
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    TOOLBAR_Refresh (wndPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return TRUE;
-}
-
-
-// << TOOLBAR_InsertButton32W >>
-// << TOOLBAR_InsertMarkHitTest >>
-
-
-static LRESULT
-TOOLBAR_IsButtonChecked (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return FALSE;
-
-    return (infoPtr->buttons[nIndex].fsState & TBSTATE_CHECKED);
-}
-
-
-static LRESULT
-TOOLBAR_IsButtonEnabled (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return FALSE;
-
-    return (infoPtr->buttons[nIndex].fsState & TBSTATE_ENABLED);
-}
-
-
-static LRESULT
-TOOLBAR_IsButtonHidden (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return FALSE;
-
-    return (infoPtr->buttons[nIndex].fsState & TBSTATE_HIDDEN);
-}
-
-
-static LRESULT
-TOOLBAR_IsButtonHighlighted (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return FALSE;
-
-    return (infoPtr->buttons[nIndex].fsState & TBSTATE_MARKED);
-}
-
-
-static LRESULT
-TOOLBAR_IsButtonIndeterminate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return FALSE;
-
-    return (infoPtr->buttons[nIndex].fsState & TBSTATE_INDETERMINATE);
-}
-
-
-static LRESULT
-TOOLBAR_IsButtonPressed (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return FALSE;
-
-    return (infoPtr->buttons[nIndex].fsState & TBSTATE_PRESSED);
-}
-
-
-// << TOOLBAR_LoadImages >>
-// << TOOLBAR_MapAccelerator >>
-// << TOOLBAR_MarkButton >>
-// << TOOLBAR_MoveButton >>
-
-
-static LRESULT
-TOOLBAR_PressButton (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    HDC32 hdc;
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return FALSE;
-
-    btnPtr = &infoPtr->buttons[nIndex];
-    if (LOWORD(lParam) == FALSE)
-	btnPtr->fsState &= ~TBSTATE_PRESSED;
-    else
-	btnPtr->fsState |= TBSTATE_PRESSED;
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return TRUE;
-}
-
-
-// << TOOLBAR_ReplaceBitmap >>
-
-
-static LRESULT
-TOOLBAR_SaveRestore32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    LPTBSAVEPARAMS32A lpSave = (LPTBSAVEPARAMS32A)lParam;
-
-    if (lpSave == NULL) return 0;
-
-    if ((BOOL32)wParam) {
-	/* save toolbar information */
-	FIXME (toolbar, "save to \"%s\" \"%s\"\n",
-	       lpSave->pszSubKey, lpSave->pszValueName);
-
-
-    }
-    else {
-	/* restore toolbar information */
-
-	FIXME (toolbar, "restore from \"%s\" \"%s\"\n",
-	       lpSave->pszSubKey, lpSave->pszValueName);
-
-
-    }
-
-    return 0;
-}
-
-
-// << TOOLBAR_SaveRestore32W >>
-// << TOOLBAR_SetAnchorHighlight >>
-
-
-static LRESULT
-TOOLBAR_SetBitmapSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    if ((LOWORD(lParam) <= 0) || (HIWORD(lParam)<=0))
-	return FALSE;
-
-    infoPtr->nBitmapWidth = (INT32)LOWORD(lParam);
-    infoPtr->nBitmapHeight = (INT32)HIWORD(lParam);
-
-    return TRUE;
-}
-
-
-// << TOOLBAR_SetButtonInfo >>
-
-
-static LRESULT
-TOOLBAR_SetButtonSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    if ((LOWORD(lParam) <= 0) || (HIWORD(lParam)<=0))
-	return FALSE;
-
-    infoPtr->nButtonWidth = (INT32)LOWORD(lParam);
-    infoPtr->nButtonHeight = (INT32)HIWORD(lParam);
-
-    return TRUE;
-}
-
-
-static LRESULT
-TOOLBAR_SetButtonWidth (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    if (infoPtr == NULL)
-	return FALSE;
-
-    infoPtr->cxMin = (INT32)LOWORD(lParam);
-    infoPtr->cxMax = (INT32)HIWORD(lParam);
-
-    return TRUE;
-}
-
-
-static LRESULT
-TOOLBAR_SetCmdId (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    INT32 nIndex = (INT32)wParam;
-
-    if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
-	return FALSE;
-
-    infoPtr->buttons[nIndex].idCommand = (INT32)lParam;
-
-    if (infoPtr->hwndToolTip) {
-
-	FIXME (toolbar, "change tool tip!\n");
-
-    }
-
-    return TRUE;
-}
-
-
-// << TOOLBAR_SetColorScheme >>
-
-
-static LRESULT
-TOOLBAR_SetDisabledImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    HIMAGELIST himlTemp;
-
-    if (!(wndPtr->dwStyle & TBSTYLE_FLAT))
-	return 0;
-
-    himlTemp = infoPtr->himlDis;
-    infoPtr->himlDis = (HIMAGELIST)lParam;
-
-    /* FIXME: redraw ? */
-
-    return (LRESULT)himlTemp; 
-}
-
-
-// << TOOLBAR_SetDrawTextFlags >>
-
-
-static LRESULT
-TOOLBAR_SetExtendedStyle (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    DWORD dwTemp;
-
-    dwTemp = infoPtr->dwExStyle;
-    infoPtr->dwExStyle = (DWORD)lParam;
-
-    return (LRESULT)dwTemp; 
-}
-
-
-static LRESULT
-TOOLBAR_SetHotImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    HIMAGELIST himlTemp;
-
-    if (!(wndPtr->dwStyle & TBSTYLE_FLAT))
-	return 0;
-
-    himlTemp = infoPtr->himlHot;
-    infoPtr->himlHot = (HIMAGELIST)lParam;
-
-    /* FIXME: redraw ? */
-
-    return (LRESULT)himlTemp; 
-}
-
-
-// << TOOLBAR_SetHotItem >>
-
-
-static LRESULT
-TOOLBAR_SetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    HIMAGELIST himlTemp;
-
-    if (!(wndPtr->dwStyle & TBSTYLE_FLAT))
-	return 0;
-
-    himlTemp = infoPtr->himlDef;
-    infoPtr->himlDef = (HIMAGELIST)lParam;
-
-    /* FIXME: redraw ? */
-
-    return (LRESULT)himlTemp; 
-}
-
-
-static LRESULT
-TOOLBAR_SetIndent (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    HDC32 hdc;
-
-    infoPtr->nIndent = (INT32)wParam;
-    TOOLBAR_CalcToolbar (wndPtr);
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    TOOLBAR_Refresh (wndPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return TRUE;
-}
-
-
-// << TOOLBAR_SetInsertMark >>
-
-
-static LRESULT
-TOOLBAR_SetInsertMarkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    infoPtr->clrInsertMark = (COLORREF)lParam;
-
-    /* FIXME : redraw ??*/
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLBAR_SetMaxTextRows (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    if (infoPtr == NULL)
-	return FALSE;
-
-    infoPtr->nMaxTextRows = (INT32)wParam;
-
-    return TRUE;
-}
-
-
-// << TOOLBAR_SetPadding >>
-
-
-static LRESULT
-TOOLBAR_SetParent (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    HWND32 hwndOldNotify;
-
-    if (infoPtr == NULL) return 0;
-    hwndOldNotify = infoPtr->hwndNotify;
-    infoPtr->hwndNotify = (HWND32)wParam;
-
-    return hwndOldNotify;
-}
-
-
-static LRESULT
-TOOLBAR_SetRows (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    FIXME (toolbar, "support multiple rows!\n");
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLBAR_SetState (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    HDC32 hdc;
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return FALSE;
-
-    btnPtr = &infoPtr->buttons[nIndex];
-    btnPtr->fsState = LOWORD(lParam);
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return TRUE;
-}
-
-
-static LRESULT
-TOOLBAR_SetStyle (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    HDC32 hdc;
-    INT32 nIndex;
-
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-    if (nIndex == -1)
-	return FALSE;
-
-    btnPtr = &infoPtr->buttons[nIndex];
-    btnPtr->fsStyle = LOWORD(lParam);
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    if (infoPtr->hwndToolTip) {
-
-	FIXME (toolbar, "change tool tip!\n");
-
-    }
-
-    return TRUE;
-}
-
-
-static LRESULT
-TOOLBAR_SetToolTips (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    if (infoPtr == NULL) return 0;
-    infoPtr->hwndToolTip = (HWND32)wParam;
-    return 0;
-}
-
-
-static LRESULT
-TOOLBAR_SetUnicodeFormat (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    BOOL32 bTemp;
-
-    TRACE (toolbar, "%s hwnd=0x%04x stub!\n", 
-	   ((BOOL32)wParam) ? "TRUE" : "FALSE", wndPtr->hwndSelf);
-
-    bTemp = infoPtr->bUnicode;
-    infoPtr->bUnicode = (BOOL32)wParam;
-
-    return bTemp;
-}
-
-
-static LRESULT
-TOOLBAR_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    LOGFONT32A logFont;
-
-    /* initialize info structure */
-    infoPtr->nButtonHeight = 22;
-    infoPtr->nButtonWidth = 23;
-    infoPtr->nBitmapHeight = 15;
-    infoPtr->nBitmapWidth = 16;
-
-    infoPtr->nHeight = infoPtr->nButtonHeight + TOP_BORDER + BOTTOM_BORDER;
-    infoPtr->nMaxRows = 1;
-    infoPtr->nMaxTextRows = 1;
-    infoPtr->cxMin = -1;
-    infoPtr->cxMax = -1;
-
-    infoPtr->bCaptured = FALSE;
-    infoPtr->bUnicode = FALSE;
-    infoPtr->nButtonDown = -1;
-    infoPtr->nOldHit = -1;
-
-    infoPtr->hwndNotify = GetParent32 (wndPtr->hwndSelf);
-    infoPtr->bTransparent = (wndPtr->dwStyle & TBSTYLE_FLAT);
-    infoPtr->nHotItem = -1;
-
-    SystemParametersInfo32A (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
-    infoPtr->hFont = CreateFontIndirect32A (&logFont);
-
-    if (wndPtr->dwStyle & TBSTYLE_TOOLTIPS) {
-	/* Create tooltip control */
-	infoPtr->hwndToolTip =
-	    CreateWindowEx32A (0, TOOLTIPS_CLASS32A, NULL, TTS_ALWAYSTIP,
-			       CW_USEDEFAULT32, CW_USEDEFAULT32,
-			       CW_USEDEFAULT32, CW_USEDEFAULT32,
-			       wndPtr->hwndSelf, 0, 0, 0);
-
-	/* Send NM_TOOLTIPSCREATED notification */
-	if (infoPtr->hwndToolTip) {
-	    NMTOOLTIPSCREATED nmttc;
-
-	    nmttc.hdr.hwndFrom = wndPtr->hwndSelf;
-	    nmttc.hdr.idFrom = wndPtr->wIDmenu;
-	    nmttc.hdr.code = NM_TOOLTIPSCREATED;
-	    nmttc.hwndToolTips = infoPtr->hwndToolTip;
-
-	    SendMessage32A (infoPtr->hwndNotify, WM_NOTIFY,
-			    (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmttc);
-	}
-    }
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLBAR_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    /* delete tooltip control */
-    if (infoPtr->hwndToolTip)
-	DestroyWindow32 (infoPtr->hwndToolTip);
-
-    /* delete button data */
-    if (infoPtr->buttons)
-	HeapFree (GetProcessHeap (), 0, infoPtr->buttons);
-
-    /* delete strings */
-    if (infoPtr->strings) {
-	INT32 i;
-	for (i = 0; i < infoPtr->nNumStrings; i++)
-	    if (infoPtr->strings[i])
-		HeapFree (GetProcessHeap (), 0, infoPtr->strings[i]);
-
-	HeapFree (GetProcessHeap (), 0, infoPtr->strings);
-    }
-
-    /* destroy default image list */
-    if (infoPtr->himlDef)
-	ImageList_Destroy (infoPtr->himlDef);
-
-    /* destroy disabled image list */
-    if (infoPtr->himlDis)
-	ImageList_Destroy (infoPtr->himlDis);
-
-    /* destroy hot image list */
-    if (infoPtr->himlHot)
-	ImageList_Destroy (infoPtr->himlHot);
-
-    /* delete default font */
-    if (infoPtr->hFont)
-	DeleteObject32 (infoPtr->hFont);
-
-    /* free toolbar info data */
-    HeapFree (GetProcessHeap (), 0, infoPtr);
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLBAR_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-
-    if (infoPtr->bTransparent)
-	return SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_ERASEBKGND,
-			       wParam, lParam);
-
-    return DefWindowProc32A (wndPtr->hwndSelf, WM_ERASEBKGND, wParam, lParam);
-}
-
-
-static LRESULT
-TOOLBAR_LButtonDblClk (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    POINT32 pt;
-    INT32   nHit;
-    HDC32   hdc;
-
-    pt.x = (INT32)LOWORD(lParam);
-    pt.y = (INT32)HIWORD(lParam);
-    nHit = TOOLBAR_InternalHitTest (wndPtr, &pt);
-
-    if (nHit >= 0) {
-	btnPtr = &infoPtr->buttons[nHit];
-	if (!(btnPtr->fsState & TBSTATE_ENABLED))
-	    return 0;
-	SetCapture32 (wndPtr->hwndSelf);
-	infoPtr->bCaptured = TRUE;
-	infoPtr->nButtonDown = nHit;
-
-	btnPtr->fsState |= TBSTATE_PRESSED;
-
-	hdc = GetDC32 (wndPtr->hwndSelf);
-	TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
-	ReleaseDC32 (wndPtr->hwndSelf, hdc);
-    }
-    else if (wndPtr->dwStyle & CCS_ADJUSTABLE)
-	TOOLBAR_Customize (wndPtr);
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLBAR_LButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    POINT32 pt;
-    INT32   nHit;
-    HDC32   hdc;
-
-    if (infoPtr->hwndToolTip)
-	TOOLBAR_RelayEvent (infoPtr->hwndToolTip, wndPtr->hwndSelf,
-			    WM_LBUTTONDOWN, wParam, lParam);
-
-    pt.x = (INT32)LOWORD(lParam);
-    pt.y = (INT32)HIWORD(lParam);
-    nHit = TOOLBAR_InternalHitTest (wndPtr, &pt);
-
-    if (nHit >= 0) {
-	btnPtr = &infoPtr->buttons[nHit];
-	if (!(btnPtr->fsState & TBSTATE_ENABLED))
-	    return 0;
-
-	SetCapture32 (wndPtr->hwndSelf);
-	infoPtr->bCaptured = TRUE;
-	infoPtr->nButtonDown = nHit;
-	infoPtr->nOldHit = nHit;
-
-	btnPtr->fsState |= TBSTATE_PRESSED;
-
-	hdc = GetDC32 (wndPtr->hwndSelf);
-	TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
-	ReleaseDC32 (wndPtr->hwndSelf, hdc);
-    }
-    
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLBAR_LButtonUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    POINT32 pt;
-    INT32   nHit;
-    INT32   nOldIndex = -1;
-    HDC32   hdc;
-    BOOL32  bSendMessage = TRUE;
-
-    if (infoPtr->hwndToolTip)
-	TOOLBAR_RelayEvent (infoPtr->hwndToolTip, wndPtr->hwndSelf,
-			    WM_LBUTTONUP, wParam, lParam);
-
-    pt.x = (INT32)LOWORD(lParam);
-    pt.y = (INT32)HIWORD(lParam);
-    nHit = TOOLBAR_InternalHitTest (wndPtr, &pt);
-
-    if ((infoPtr->bCaptured) && (infoPtr->nButtonDown >= 0)) {
-	infoPtr->bCaptured = FALSE;
-	ReleaseCapture ();
-	btnPtr = &infoPtr->buttons[infoPtr->nButtonDown];
-	btnPtr->fsState &= ~TBSTATE_PRESSED;
-
-	if (nHit == infoPtr->nButtonDown) {
-	    if (btnPtr->fsStyle & TBSTYLE_CHECK) {
-		if (btnPtr->fsStyle & TBSTYLE_GROUP) {
-		    nOldIndex = TOOLBAR_GetCheckedGroupButtonIndex (infoPtr,
-			infoPtr->nButtonDown);
-		    if (nOldIndex == infoPtr->nButtonDown)
-			bSendMessage = FALSE;
-		    if ((nOldIndex != infoPtr->nButtonDown) && 
-			(nOldIndex != -1))
-			infoPtr->buttons[nOldIndex].fsState &= ~TBSTATE_CHECKED;
-		    btnPtr->fsState |= TBSTATE_CHECKED;
-		}
-		else {
-		    if (btnPtr->fsState & TBSTATE_CHECKED)
-			btnPtr->fsState &= ~TBSTATE_CHECKED;
-		    else
-			btnPtr->fsState |= TBSTATE_CHECKED;
-		}
-	    }
-	}
-	else
-	    bSendMessage = FALSE;
-
-	hdc = GetDC32 (wndPtr->hwndSelf);
-	if (nOldIndex != -1)
-	    TOOLBAR_DrawButton (wndPtr, &infoPtr->buttons[nOldIndex], hdc);
-	TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
-	ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-	if (bSendMessage)
-	    SendMessage32A (infoPtr->hwndNotify, WM_COMMAND,
-			    MAKEWPARAM(btnPtr->idCommand, 0),
-			    (LPARAM)wndPtr->hwndSelf);
-
-	infoPtr->nButtonDown = -1;
-	infoPtr->nOldHit = -1;
-    }
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLBAR_MouseMove (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    TBUTTON_INFO *btnPtr;
-    POINT32 pt;
-    INT32   nHit;
-    HDC32   hdc;
-
-    if (infoPtr->hwndToolTip)
-	TOOLBAR_RelayEvent (infoPtr->hwndToolTip, wndPtr->hwndSelf,
-			    WM_MOUSEMOVE, wParam, lParam);
-
-    pt.x = (INT32)LOWORD(lParam);
-    pt.y = (INT32)HIWORD(lParam);
-    nHit = TOOLBAR_InternalHitTest (wndPtr, &pt);
-
-    if (infoPtr->bCaptured) {
-	if (infoPtr->nOldHit != nHit) {
-	    btnPtr = &infoPtr->buttons[infoPtr->nButtonDown];
-	    if (infoPtr->nOldHit == infoPtr->nButtonDown) {
-		btnPtr->fsState &= ~TBSTATE_PRESSED;
-		hdc = GetDC32 (wndPtr->hwndSelf);
-		TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
-		ReleaseDC32 (wndPtr->hwndSelf, hdc);
-	    }
-	    else if (nHit == infoPtr->nButtonDown) {
-		btnPtr->fsState |= TBSTATE_PRESSED;
-		hdc = GetDC32 (wndPtr->hwndSelf);
-		TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
-		ReleaseDC32 (wndPtr->hwndSelf, hdc);
-	    }
-	}
-	infoPtr->nOldHit = nHit;
-    }
-
-    return 0;
-}
-
-
-// << TOOLBAR_NCActivate >>
-
-
-static LRESULT
-TOOLBAR_NCCalcSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    if (!(wndPtr->dwStyle & CCS_NODIVIDER)) {
-	LPRECT32 winRect  = (LPRECT32)lParam;
-	winRect->top += 2;   
-    }
-
-    return DefWindowProc32A (wndPtr->hwndSelf, WM_NCCALCSIZE, wParam, lParam);
-}
-
-
-static LRESULT
-TOOLBAR_NCCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr;
-
-    /* allocate memory for info structure */
-    infoPtr = (TOOLBAR_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-                                   sizeof(TOOLBAR_INFO));
-    wndPtr->wExtra[0] = (DWORD)infoPtr;
-
-    if (infoPtr == NULL) {
-	ERR (toolbar, "could not allocate info memory!\n");
-	return 0;
-    }
-
-    if ((TOOLBAR_INFO*)wndPtr->wExtra[0] != infoPtr) {
-	ERR (toolbar, "pointer assignment error!\n");
-	return 0;
-    }
-
-    /* paranoid!! */
-    infoPtr->dwStructSize = sizeof(TBBUTTON);
-
-    /* fix instance handle, if the toolbar was created by CreateToolbarEx() */
-    if (!wndPtr->hInstance)
-	wndPtr->hInstance = wndPtr->parent->hInstance;
-
-    return DefWindowProc32A (wndPtr->hwndSelf, WM_NCCREATE, wParam, lParam);
-}
-
-
-static LRESULT
-TOOLBAR_NCPaint (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HDC32 hdc;
-    RECT32 rect;
-    HWND32 hwnd = wndPtr->hwndSelf;
-
-    if ( wndPtr->dwStyle & WS_MINIMIZE ||
-	!WIN_IsWindowDrawable( wndPtr, 0 )) return 0; /* Nothing to do */
-
-    DefWindowProc32A (hwnd, WM_NCPAINT, wParam, lParam);
-
-    if (!(hdc = GetDCEx32( hwnd, 0, DCX_USESTYLE | DCX_WINDOW ))) return 0;
-
-    if (ExcludeVisRect( hdc, wndPtr->rectClient.left-wndPtr->rectWindow.left,
-		        wndPtr->rectClient.top-wndPtr->rectWindow.top,
-		        wndPtr->rectClient.right-wndPtr->rectWindow.left,
-		        wndPtr->rectClient.bottom-wndPtr->rectWindow.top )
-	== NULLREGION){
-	ReleaseDC32( hwnd, hdc );
-	return 0;
-    }
-
-    if (!(wndPtr->flags & WIN_MANAGED)) {
-	if (!(wndPtr->dwStyle & CCS_NODIVIDER)) {
-	    rect.left = wndPtr->rectClient.left;
-	    rect.top = wndPtr->rectClient.top - 2;
-	    rect.right = wndPtr->rectClient.right;
-
-	    SelectObject32 ( hdc, GetSysColorPen32 (COLOR_3DSHADOW));
-	    MoveToEx32 (hdc, rect.left, rect.top, NULL);
-	    LineTo32 (hdc, rect.right, rect.top);
-	    rect.top++;
-	    SelectObject32 ( hdc, GetSysColorPen32 (COLOR_3DHILIGHT));
-	    MoveToEx32 (hdc, rect.left, rect.top, NULL);
-	    LineTo32 (hdc, rect.right, rect.top);
-	}
-
-    }
-
-    ReleaseDC32( hwnd, hdc );
-
-    return 0;
-}
-
-
-__inline__ static LRESULT
-TOOLBAR_Notify (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    LPNMHDR lpnmh = (LPNMHDR)lParam;
-
-    TRACE (toolbar, "passing WM_NOTIFY!\n");
-
-    if ((infoPtr->hwndToolTip) && (lpnmh->hwndFrom == infoPtr->hwndToolTip)) {
-	SendMessage32A (infoPtr->hwndNotify, WM_NOTIFY,	wParam, lParam);
-
-#if 0
-	if (lpnmh->code == TTN_GETDISPINFO32A) {
-	    LPNMTTDISPINFO32A lpdi = (LPNMTTDISPINFO32A)lParam;
-
-	    FIXME (toolbar, "retrieving ASCII string\n");
-
-	}
-	else if (lpnmh->code == TTN_GETDISPINFO32W) {
-	    LPNMTTDISPINFO32W lpdi = (LPNMTTDISPINFO32W)lParam;
-
-	    FIXME (toolbar, "retrieving UNICODE string\n");
-
-	}
-#endif
-    }
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLBAR_Paint (WND *wndPtr, WPARAM32 wParam)
-{
-    HDC32 hdc;
-    PAINTSTRUCT32 ps;
-
-    hdc = wParam==0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
-    TOOLBAR_Refresh (wndPtr, hdc);
-    if (!wParam)
-	EndPaint32 (wndPtr->hwndSelf, &ps);
-    return 0;
-}
-
-
-static LRESULT
-TOOLBAR_Size (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
-    RECT32 parent_rect;
-    HWND32 parent;
-    INT32  x, y, cx, cy;
-    INT32  flags;
-    UINT32 uPosFlags = 0;
-
-    /* Resize deadlock check */
-    if (infoPtr->bAutoSize) {
-	infoPtr->bAutoSize = FALSE;
-	return 0;
-    }
-
-    flags = (INT32) wParam;
-
-    /* FIXME for flags =
-     * SIZE_MAXIMIZED, SIZE_MAXSHOW, SIZE_MINIMIZED
-     */
-
-    TRACE (toolbar, "sizing toolbar!\n");
-
-    if (flags == SIZE_RESTORED) {
-	/* width and height don't apply */
-	parent = GetParent32 (wndPtr->hwndSelf);
-	GetClientRect32(parent, &parent_rect);
-
-	if (wndPtr->dwStyle & CCS_NORESIZE) {
-	    uPosFlags |= SWP_NOSIZE;
-
-	    /* FIXME */
-//	    infoPtr->nWidth = parent_rect.right - parent_rect.left;
-	    cy = infoPtr->nHeight;
-	    cx = infoPtr->nWidth;
-	    TOOLBAR_CalcToolbar (wndPtr);
-	    infoPtr->nWidth = cx;
-	    infoPtr->nHeight = cy;
-	}
-	else {
-	    infoPtr->nWidth = parent_rect.right - parent_rect.left;
-	    TOOLBAR_CalcToolbar (wndPtr);
-	    cy = infoPtr->nHeight;
-	    cx = infoPtr->nWidth;
-	}
-
-	if (wndPtr->dwStyle & CCS_NOPARENTALIGN) {
-	    uPosFlags |= SWP_NOMOVE;
-	    cy = infoPtr->nHeight;
-	    cx = infoPtr->nWidth;
-	}
-
-	if (!(wndPtr->dwStyle & CCS_NODIVIDER))
-	    cy += 2;
-
-	SetWindowPos32 (wndPtr->hwndSelf, 0, parent_rect.left, parent_rect.top,
-			cx, cy, uPosFlags | SWP_NOZORDER);
-    }
-    return 0;
-}
-
-
-
-
-
-
-
-LRESULT WINAPI
-ToolbarWindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
-{
-    WND *wndPtr = WIN_FindWndPtr(hwnd);
-
-    switch (uMsg)
-    {
-	case TB_ADDBITMAP:
-	    return TOOLBAR_AddBitmap (wndPtr, wParam, lParam);
-
-	case TB_ADDBUTTONS32A:
-	    return TOOLBAR_AddButtons32A (wndPtr, wParam, lParam);
-
-//	case TB_ADDBUTTONS32W:
-
-	case TB_ADDSTRING32A:
-	    return TOOLBAR_AddString32A (wndPtr, wParam, lParam);
-
-//	case TB_ADDSTRING32W:
-
-	case TB_AUTOSIZE:
-	    return TOOLBAR_AutoSize (wndPtr, wParam, lParam);
-
-	case TB_BUTTONCOUNT:
-	    return TOOLBAR_ButtonCount (wndPtr, wParam, lParam);
-
-	case TB_BUTTONSTRUCTSIZE:
-	    return TOOLBAR_ButtonStructSize (wndPtr, wParam, lParam);
-
-	case TB_CHANGEBITMAP:
-	    return TOOLBAR_ChangeBitmap (wndPtr, wParam, lParam);
-
-	case TB_CHECKBUTTON:
-	    return TOOLBAR_CheckButton (wndPtr, wParam, lParam);
-
-	case TB_COMMANDTOINDEX:
-	    return TOOLBAR_CommandToIndex (wndPtr, wParam, lParam);
-
-	case TB_CUSTOMIZE:
-	    return TOOLBAR_Customize (wndPtr);
-
-	case TB_DELETEBUTTON:
-	    return TOOLBAR_DeleteButton (wndPtr, wParam, lParam);
-
-	case TB_ENABLEBUTTON:
-	    return TOOLBAR_EnableButton (wndPtr, wParam, lParam);
-
-//	case TB_GETANCHORHIGHLIGHT:		/* 4.71 */
-
-	case TB_GETBITMAP:
-	    return TOOLBAR_GetBitmap (wndPtr, wParam, lParam);
-
-	case TB_GETBITMAPFLAGS:
-	    return TOOLBAR_GetBitmapFlags (wndPtr, wParam, lParam);
-
-	case TB_GETBUTTON:
-	    return TOOLBAR_GetButton (wndPtr, wParam, lParam);
-
-	case TB_GETBUTTONINFO32A:
-	    return TOOLBAR_GetButtonInfo32A (wndPtr, wParam, lParam);
-
-//	case TB_GETBUTTONINFO32W:		/* 4.71 */
-
-	case TB_GETBUTTONSIZE:
-	    return TOOLBAR_GetButtonSize (wndPtr);
-
-	case TB_GETBUTTONTEXT32A:
-	    return TOOLBAR_GetButtonText32A (wndPtr, wParam, lParam);
-
-//	case TB_GETBUTTONTEXT32W:
-//	case TB_GETCOLORSCHEME:			/* 4.71 */
-
-	case TB_GETDISABLEDIMAGELIST:
-	    return TOOLBAR_GetDisabledImageList (wndPtr, wParam, lParam);
-
-	case TB_GETEXTENDEDSTYLE:
-	    return TOOLBAR_GetExtendedStyle (wndPtr);
-
-	case TB_GETHOTIMAGELIST:
-	    return TOOLBAR_GetHotImageList (wndPtr, wParam, lParam);
-
-//	case TB_GETHOTITEM:			/* 4.71 */
-
-	case TB_GETIMAGELIST:
-	    return TOOLBAR_GetImageList (wndPtr, wParam, lParam);
-
-//	case TB_GETINSERTMARK:			/* 4.71 */
-//	case TB_GETINSERTMARKCOLOR:		/* 4.71 */
-
-	case TB_GETITEMRECT:
-	    return TOOLBAR_GetItemRect (wndPtr, wParam, lParam);
-
-	case TB_GETMAXSIZE:
-	    return TOOLBAR_GetMaxSize (wndPtr, wParam, lParam);
-
-//	case TB_GETOBJECT:			/* 4.71 */
-//	case TB_GETPADDING:			/* 4.71 */
-
-	case TB_GETRECT:
-	    return TOOLBAR_GetRect (wndPtr, wParam, lParam);
-
-	case TB_GETROWS:
-	    return TOOLBAR_GetRows (wndPtr, wParam, lParam);
-
-	case TB_GETSTATE:
-	    return TOOLBAR_GetState (wndPtr, wParam, lParam);
-
-	case TB_GETSTYLE:
-	    return TOOLBAR_GetStyle (wndPtr, wParam, lParam);
-
-	case TB_GETTEXTROWS:
-	    return TOOLBAR_GetTextRows (wndPtr, wParam, lParam);
-
-	case TB_GETTOOLTIPS:
-	    return TOOLBAR_GetToolTips (wndPtr, wParam, lParam);
-
-	case TB_GETUNICODEFORMAT:
-	    return TOOLBAR_GetUnicodeFormat (wndPtr, wParam, lParam);
-
-	case TB_HIDEBUTTON:
-	    return TOOLBAR_HideButton (wndPtr, wParam, lParam);
-
-	case TB_HITTEST:
-	    return TOOLBAR_HitTest (wndPtr, wParam, lParam);
-
-	case TB_INDETERMINATE:
-	    return TOOLBAR_Indeterminate (wndPtr, wParam, lParam);
-
-	case TB_INSERTBUTTON32A:
-	    return TOOLBAR_InsertButton32A (wndPtr, wParam, lParam);
-
-//	case TB_INSERTBUTTON32W:
-//	case TB_INSERTMARKHITTEST:		/* 4.71 */
-
-	case TB_ISBUTTONCHECKED:
-	    return TOOLBAR_IsButtonChecked (wndPtr, wParam, lParam);
-
-	case TB_ISBUTTONENABLED:
-	    return TOOLBAR_IsButtonEnabled (wndPtr, wParam, lParam);
-
-	case TB_ISBUTTONHIDDEN:
-	    return TOOLBAR_IsButtonHidden (wndPtr, wParam, lParam);
-
-	case TB_ISBUTTONHIGHLIGHTED:
-	    return TOOLBAR_IsButtonHighlighted (wndPtr, wParam, lParam);
-
-	case TB_ISBUTTONINDETERMINATE:
-	    return TOOLBAR_IsButtonIndeterminate (wndPtr, wParam, lParam);
-
-	case TB_ISBUTTONPRESSED:
-	    return TOOLBAR_IsButtonPressed (wndPtr, wParam, lParam);
-
-//	case TB_LOADIMAGES:			/* 4.70 */
-//	case TB_MAPACCELERATOR32A:		/* 4.71 */
-//	case TB_MAPACCELERATOR32W:		/* 4.71 */
-//	case TB_MARKBUTTON:			/* 4.71 */
-//	case TB_MOVEBUTTON:			/* 4.71 */
-
-	case TB_PRESSBUTTON:
-	    return TOOLBAR_PressButton (wndPtr, wParam, lParam);
-
-//	case TB_REPLACEBITMAP:
-
-	case TB_SAVERESTORE32A:
-	    return TOOLBAR_SaveRestore32A (wndPtr, wParam, lParam);
-
-//	case TB_SAVERESTORE32W:
-//	case TB_SETANCHORHIGHLIGHT:		/* 4.71 */
-
-	case TB_SETBITMAPSIZE:
-	    return TOOLBAR_SetBitmapSize (wndPtr, wParam, lParam);
-
-//	case TB_SETBUTTONINFO32A:		/* 4.71 */
-//	case TB_SETBUTTONINFO32W:		/* 4.71 */
-
-	case TB_SETBUTTONSIZE:
-	    return TOOLBAR_SetButtonSize (wndPtr, wParam, lParam);
-
-	case TB_SETBUTTONWIDTH:
-	    return TOOLBAR_SetButtonWidth (wndPtr, wParam, lParam);
-
-	case TB_SETCMDID:
-	    return TOOLBAR_SetCmdId (wndPtr, wParam, lParam);
-
-//	case TB_SETCOLORSCHEME:			/* 4.71 */
-
-	case TB_SETDISABLEDIMAGELIST:
-	    return TOOLBAR_SetDisabledImageList (wndPtr, wParam, lParam);
-
-//	case TB_SETDRAWTEXTFLAGS:		/* 4.71 */
-
-	case TB_SETEXTENDEDSTYLE:
-	    return TOOLBAR_SetExtendedStyle (wndPtr, wParam, lParam);
-
-	case TB_SETHOTIMAGELIST:
-	    return TOOLBAR_SetHotImageList (wndPtr, wParam, lParam);
-
-//	case TB_SETHOTITEM:			/* 4.71 */
-
-	case TB_SETIMAGELIST:
-	    return TOOLBAR_SetImageList (wndPtr, wParam, lParam);
-
-	case TB_SETINDENT:
-	    return TOOLBAR_SetIndent (wndPtr, wParam, lParam);
-
-//	case TB_SETINSERTMARK:			/* 4.71 */
-
-	case TB_SETINSERTMARKCOLOR:
-	    return TOOLBAR_SetInsertMarkColor (wndPtr, wParam, lParam);
-
-	case TB_SETMAXTEXTROWS:
-	    return TOOLBAR_SetMaxTextRows (wndPtr, wParam, lParam);
-
-//	case TB_SETPADDING:			/* 4.71 */
-
-	case TB_SETPARENT:
-	    return TOOLBAR_SetParent (wndPtr, wParam, lParam);
-
-	case TB_SETROWS:
-	    return TOOLBAR_SetRows (wndPtr, wParam, lParam);
-
-	case TB_SETSTATE:
-	    return TOOLBAR_SetState (wndPtr, wParam, lParam);
-
-	case TB_SETSTYLE:
-	    return TOOLBAR_SetStyle (wndPtr, wParam, lParam);
-
-	case TB_SETTOOLTIPS:
-	    return TOOLBAR_SetToolTips (wndPtr, wParam, lParam);
-
-	case TB_SETUNICODEFORMAT:
-	    return TOOLBAR_SetUnicodeFormat (wndPtr, wParam, lParam);
-
-
-//	case WM_CHAR:
-
-	case WM_CREATE:
-	    return TOOLBAR_Create (wndPtr, wParam, lParam);
-
-//	case WM_COMMAND:
-
-	case WM_DESTROY:
-	    return TOOLBAR_Destroy (wndPtr, wParam, lParam);
-
-	case WM_ERASEBKGND:
-	    return TOOLBAR_EraseBackground (wndPtr, wParam, lParam);
-
-//	case WM_GETFONT:
-//	case WM_KEYDOWN:
-//	case WM_KILLFOCUS:
-
-	case WM_LBUTTONDBLCLK:
-	    return TOOLBAR_LButtonDblClk (wndPtr, wParam, lParam);
-
-	case WM_LBUTTONDOWN:
-	    return TOOLBAR_LButtonDown (wndPtr, wParam, lParam);
-
-	case WM_LBUTTONUP:
-	    return TOOLBAR_LButtonUp (wndPtr, wParam, lParam);
-
-	case WM_MOUSEMOVE:
-	    return TOOLBAR_MouseMove (wndPtr, wParam, lParam);
-
-//	case WM_NCACTIVATE:
-//	    return TOOLBAR_NCActivate (wndPtr, wParam, lParam);
-
-	case WM_NCCALCSIZE:
-	    return TOOLBAR_NCCalcSize (wndPtr, wParam, lParam);
-
-	case WM_NCCREATE:
-	    return TOOLBAR_NCCreate (wndPtr, wParam, lParam);
-
-	case WM_NCPAINT:
-	    return TOOLBAR_NCPaint (wndPtr, wParam, lParam);
-
-	case WM_NOTIFY:
-	    return TOOLBAR_Notify (wndPtr, wParam, lParam);
-
-//	case WM_NOTIFYFORMAT:
-
-	case WM_PAINT:
-	    return TOOLBAR_Paint (wndPtr, wParam);
-
-	case WM_SIZE:
-	    return TOOLBAR_Size (wndPtr, wParam, lParam);
-
-//	case WM_SYSCOLORCHANGE:
-
-//	case WM_WININICHANGE:
-
-	case WM_CHARTOITEM:
-	case WM_COMMAND:
-	case WM_DRAWITEM:
-	case WM_MEASUREITEM:
-	case WM_VKEYTOITEM:
-	    return SendMessage32A (GetParent32 (hwnd), uMsg, wParam, lParam);
-
-	default:
-	    if (uMsg >= WM_USER)
-		ERR (toolbar, "unknown msg %04x wp=%08x lp=%08lx\n",
-		     uMsg, wParam, lParam);
-	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
-    }
-    return 0;
-}
-
-
-void TOOLBAR_Register (void)
-{
-    WNDCLASS32A wndClass;
-
-    if (GlobalFindAtom32A (TOOLBARCLASSNAME32A)) return;
-
-    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
-    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS;
-    wndClass.lpfnWndProc   = (WNDPROC32)ToolbarWindowProc;
-    wndClass.cbClsExtra    = 0;
-    wndClass.cbWndExtra    = sizeof(TOOLBAR_INFO *);
-    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
-    wndClass.hbrBackground = (HBRUSH32)(COLOR_3DFACE + 1);
-    wndClass.lpszClassName = TOOLBARCLASSNAME32A;
- 
-    RegisterClass32A (&wndClass);
-}
diff --git a/controls/tooltips.c b/controls/tooltips.c
deleted file mode 100644
index baf6971..0000000
--- a/controls/tooltips.c
+++ /dev/null
@@ -1,1596 +0,0 @@
-/*
- * Tool tip control
- *
- * Copyright 1998 Eric Kohl
- *
- * TODO:
- *   - Tracking tooltips (under construction).
- *   - TTS_ALWAYSTIP (undefined).
- *   - Unicode support.
- *   - Custom draw support.
- *   - The "lParam" variable from NMTTDISPINFO32A is not handled
- *     in TOOLTIPS_GetTipText.
- *
- * Testing:
- *   - Run tests using Waite Group Windows95 API Bible Volume 2.
- *     The second cdrom (chapter 3) contains executables activate.exe,
- *     curtool.exe, deltool.exe, enumtools.exe, getinfo.exe, getiptxt.exe,
- *     hittest.exe, needtext.exe, newrect.exe, updtext.exe and winfrpt.exe.
- */
-
-#include "windows.h"
-#include "commctrl.h"
-#include "tooltips.h"
-#include "heap.h"
-#include "win.h"
-#include "debug.h"
-
-
-#define ID_TIMER1  1    /* show delay timer */
-#define ID_TIMER2  2    /* auto pop timer */
-#define ID_TIMER3  3    /* tool leave timer */
-#define TT_SUBCLASS_PROP "CC32SubclassInfo"   /* property name of tooltip window handle */
-
-#define TOOLTIPS_GetInfoPtr(wndPtr) ((TOOLTIPS_INFO *)wndPtr->wExtra[0])
-
-
-LRESULT CALLBACK
-TOOLTIPS_SubclassProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam);
-
-
-static VOID
-TOOLTIPS_Refresh (WND *wndPtr, HDC32 hdc)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    RECT32 rc;
-    INT32 oldBkMode;
-    HFONT32 hOldFont;
-    UINT32 uFlags = DT_EXTERNALLEADING;
-
-    if (infoPtr->nMaxTipWidth > -1)
-	uFlags |= DT_WORDBREAK;
-    if (wndPtr->dwStyle & TTS_NOPREFIX)
-	uFlags |= DT_NOPREFIX;
-    GetClientRect32 (wndPtr->hwndSelf, &rc);
-    rc.left   += (2 + infoPtr->rcMargin.left);
-    rc.top    += (2 + infoPtr->rcMargin.top);
-    rc.right  -= (2 + infoPtr->rcMargin.right);
-    rc.bottom -= (2 + infoPtr->rcMargin.bottom);
-    oldBkMode = SetBkMode32 (hdc, TRANSPARENT);
-    SetTextColor32 (hdc, infoPtr->clrText);
-    hOldFont = SelectObject32 (hdc, infoPtr->hFont);
-    DrawText32A (hdc, infoPtr->szTipText, -1, &rc, uFlags);
-    SelectObject32 (hdc, hOldFont);
-    if (oldBkMode != TRANSPARENT)
-	SetBkMode32 (hdc, oldBkMode);
-}
-
-
-static VOID
-TOOLTIPS_GetTipText (WND *wndPtr, TOOLTIPS_INFO *infoPtr)
-{
-    TTTOOL_INFO *toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
-
-    if (toolPtr->hinst) {
-	TRACE (tooltips, "get res string %x %x\n",
-	       toolPtr->hinst, (int)toolPtr->lpszText);
-	LoadString32A (toolPtr->hinst, (UINT32)toolPtr->lpszText,
-		       infoPtr->szTipText, INFOTIPSIZE);
-    }
-    else if (toolPtr->lpszText) {
-	if (toolPtr->lpszText == LPSTR_TEXTCALLBACK32A) {
-	    NMTTDISPINFO32A ttnmdi;
-
-	    /* fill NMHDR struct */
-	    ZeroMemory (&ttnmdi, sizeof(NMTTDISPINFO32A));
-	    ttnmdi.hdr.hwndFrom = wndPtr->hwndSelf;
-	    ttnmdi.hdr.idFrom = toolPtr->uId;
-	    ttnmdi.hdr.code = TTN_GETDISPINFO32A;
-	    ttnmdi.uFlags = toolPtr->uFlags;
-	    ttnmdi.lpszText = infoPtr->szTipText;
-
-	    TRACE (tooltips, "hdr.idFrom = %x\n", ttnmdi.hdr.idFrom);
-	    SendMessage32A (toolPtr->hwnd, WM_NOTIFY,
-			    (WPARAM32)toolPtr->uId, (LPARAM)&ttnmdi);
-
-	    if (ttnmdi.hinst) {
-		LoadString32A (ttnmdi.hinst, (UINT32)ttnmdi.szText,
-			       infoPtr->szTipText, INFOTIPSIZE);
-		if (ttnmdi.uFlags & TTF_DI_SETITEM) {
-		    toolPtr->hinst = ttnmdi.hinst;
-		    toolPtr->lpszText = ttnmdi.szText;
-		}
-	    }
-	    else if (ttnmdi.szText[0]) {
-		lstrcpyn32A (infoPtr->szTipText, ttnmdi.szText, 80);
-		if (ttnmdi.uFlags & TTF_DI_SETITEM) {
-		    INT32 len = lstrlen32A (ttnmdi.szText) + 1;
-		    toolPtr->hinst = 0;
-		    toolPtr->lpszText =	
-			HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len);
-		    lstrcpy32A (toolPtr->lpszText, ttnmdi.szText);
-		}
-	    }
-	    else if (ttnmdi.lpszText == 0) {
-		/* no text available */
-		infoPtr->szTipText[0] = '\0';
-	    }
-	    else if (ttnmdi.lpszText != LPSTR_TEXTCALLBACK32A) {
-		if (ttnmdi.lpszText != infoPtr->szTipText)
-		    lstrcpyn32A (infoPtr->szTipText, ttnmdi.lpszText,
-				 INFOTIPSIZE);
-		if (ttnmdi.uFlags & TTF_DI_SETITEM) {
-		    INT32 len = lstrlen32A (ttnmdi.lpszText) + 1;
-		    toolPtr->hinst = 0;
-		    toolPtr->lpszText =	
-			HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len);
-		    lstrcpy32A (toolPtr->lpszText, ttnmdi.lpszText);
-		}
-	    }
-	    else
-		ERR (tooltips, "recursive text callback!\n");
-	}
-	else
-	    lstrcpyn32A (infoPtr->szTipText, toolPtr->lpszText, INFOTIPSIZE);
-    }
-    else
-	/* no text available */
-	infoPtr->szTipText[0] = '\0';
-
-    TRACE (tooltips, "\"%s\"\n", infoPtr->szTipText);
-}
-
-
-static VOID
-TOOLTIPS_CalcTipSize (WND *wndPtr, TOOLTIPS_INFO *infoPtr, LPSIZE32 lpSize)
-{
-    HDC32 hdc;
-    HFONT32 hOldFont;
-    UINT32 uFlags = DT_EXTERNALLEADING | DT_CALCRECT;
-    RECT32 rc = {0, 0, 0, 0};
-
-    if (infoPtr->nMaxTipWidth > -1) {
-	rc.right = infoPtr->nMaxTipWidth;
-	uFlags |= DT_WORDBREAK;
-    }
-    if (wndPtr->dwStyle & TTS_NOPREFIX)
-	uFlags |= DT_NOPREFIX;
-    TRACE (tooltips, "\"%s\"\n", infoPtr->szTipText);
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    hOldFont = SelectObject32 (hdc, infoPtr->hFont);
-    DrawText32A (hdc, infoPtr->szTipText, -1, &rc, uFlags);
-    SelectObject32 (hdc, hOldFont);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    lpSize->cx = rc.right - rc.left + 4 + 
-		 infoPtr->rcMargin.left + infoPtr->rcMargin.right;
-    lpSize->cy = rc.bottom - rc.top + 4 +
-		 infoPtr->rcMargin.bottom + infoPtr->rcMargin.top;
-}
-
-
-static VOID
-TOOLTIPS_Show (WND *wndPtr, TOOLTIPS_INFO *infoPtr)
-{
-    TTTOOL_INFO *toolPtr;
-    POINT32 pt;
-    SIZE32 size;
-    NMHDR hdr;
-
-    if (infoPtr->nTool == -1) {
-	TRACE (tooltips, "invalid tool (-1)!\n");
-	return;
-    }
-
-    infoPtr->nCurrentTool = infoPtr->nTool;
-
-    TRACE (tooltips, "Show tooltip pre %d!\n", infoPtr->nTool);
-
-    TOOLTIPS_GetTipText (wndPtr, infoPtr);
-
-    if (infoPtr->szTipText[0] == '\0') {
-	infoPtr->nCurrentTool = -1;
-	return;
-    }
-
-    TRACE (tooltips, "Show tooltip %d!\n", infoPtr->nCurrentTool);
-    toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
-
-    hdr.hwndFrom = wndPtr->hwndSelf;
-    hdr.idFrom = toolPtr->uId;
-    hdr.code = TTN_SHOW;
-    SendMessage32A (toolPtr->hwnd, WM_NOTIFY,
-		    (WPARAM32)toolPtr->uId, (LPARAM)&hdr);
-
-    TRACE (tooltips, "\"%s\"\n", infoPtr->szTipText);
-
-    TOOLTIPS_CalcTipSize (wndPtr, infoPtr, &size);
-    TRACE (tooltips, "size %d - %d\n", size.cx, size.cy);
-
-    if ((toolPtr->uFlags & TTF_TRACK) && (toolPtr->uFlags & TTF_ABSOLUTE)) {
-	pt.x = infoPtr->xTrackPos;
-	pt.y = infoPtr->yTrackPos;
-    }
-    else if (toolPtr->uFlags & TTF_CENTERTIP) {
-	RECT32 rect;
-
-	if (toolPtr->uFlags & TTF_IDISHWND)
-	    GetWindowRect32 ((HWND32)toolPtr->uId, &rect);
-	else {
-	    rect = toolPtr->rect;
-	    MapWindowPoints32 (toolPtr->hwnd, (HWND32)0, (LPPOINT32)&rect, 2);
-	}
-	pt.x = (rect.left + rect.right - size.cx) / 2;
-	pt.y = rect.bottom + 2;
-    }
-    else {
-	GetCursorPos32 (&pt);
-	pt.y += 20;
-    }
-
-    TRACE (tooltips, "pos %d - %d\n", pt.x, pt.y);
-
-//    SetWindowPos32 (wndPtr->hwndSelf, HWND_TOP, 1, 1,
-    SetWindowPos32 (wndPtr->hwndSelf, HWND_TOP, pt.x, pt.y,
-		    size.cx, size.cy, SWP_SHOWWINDOW);
-
-    SetTimer32 (wndPtr->hwndSelf, ID_TIMER2, infoPtr->nAutoPopTime, 0);
-}
-
-
-static VOID
-TOOLTIPS_Hide (WND *wndPtr, TOOLTIPS_INFO *infoPtr)
-{
-    TTTOOL_INFO *toolPtr;
-    NMHDR hdr;
-
-    if (infoPtr->nCurrentTool == -1)
-	return;
-
-    toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
-    TRACE (tooltips, "Hide tooltip %d!\n", infoPtr->nCurrentTool);
-    KillTimer32 (wndPtr->hwndSelf, ID_TIMER2);
-
-    hdr.hwndFrom = wndPtr->hwndSelf;
-    hdr.idFrom = toolPtr->uId;
-    hdr.code = TTN_POP;
-    SendMessage32A (toolPtr->hwnd, WM_NOTIFY,
-		    (WPARAM32)toolPtr->uId, (LPARAM)&hdr);
-
-    infoPtr->nCurrentTool = -1;
-
-    SetWindowPos32 (wndPtr->hwndSelf, HWND_TOP, 0, 0, 0, 0, SWP_HIDEWINDOW);
-}
-
-
-static INT32
-TOOLTIPS_GetToolFromInfoA (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFO32A lpToolInfo)
-{
-    TTTOOL_INFO *toolPtr;
-    INT32 nTool;
-
-    for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) {
-	toolPtr = &infoPtr->tools[nTool];
-
-	if (!(toolPtr->uFlags & TTF_IDISHWND) && 
-	    (lpToolInfo->hwnd == toolPtr->hwnd) &&
-	    (lpToolInfo->uId == toolPtr->uId))
-	    return nTool;
-    }
-
-    for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) {
-	toolPtr = &infoPtr->tools[nTool];
-
-	if ((toolPtr->uFlags & TTF_IDISHWND) &&
-	    (lpToolInfo->uId == toolPtr->uId))
-	    return nTool;
-    }
-
-    return -1;
-}
-
-
-static INT32
-TOOLTIPS_GetToolFromPoint (TOOLTIPS_INFO *infoPtr, HWND32 hwnd, LPPOINT32 lpPt)
-{
-    TTTOOL_INFO *toolPtr;
-    INT32  nTool;
-
-    for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) {
-	toolPtr = &infoPtr->tools[nTool];
-
-	if (!(toolPtr->uFlags & TTF_IDISHWND)) {
-	    if (hwnd != toolPtr->hwnd)
-		continue;
-	    if (!PtInRect32 (&toolPtr->rect, *lpPt))
-		continue;
-	    return nTool;
-	}
-    }
-
-    for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) {
-	toolPtr = &infoPtr->tools[nTool];
-
-	if (toolPtr->uFlags & TTF_IDISHWND) {
-	    if ((HWND32)toolPtr->uId == hwnd)
-		return nTool;
-	}
-    }
-
-    return -1;
-}
-
-
-static INT32
-TOOLTIPS_GetToolFromMessage (TOOLTIPS_INFO *infoPtr, HWND32 hwndTool)
-{
-    DWORD   dwPos;
-    POINT32 pt;
-
-    dwPos = GetMessagePos ();
-    pt.x = (INT32)LOWORD(dwPos);
-    pt.y = (INT32)HIWORD(dwPos);
-    ScreenToClient32 (hwndTool, &pt);
-
-    return TOOLTIPS_GetToolFromPoint (infoPtr, hwndTool, &pt);
-}
-
-
-static BOOL32
-TOOLTIPS_CheckTool (WND *wndPtr)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    POINT32 pt;
-    HWND32 hwndTool;
-    INT32 nTool;
-
-    GetCursorPos32 (&pt);
-    hwndTool =
-	SendMessage32A (wndPtr->hwndSelf, TTM_WINDOWFROMPOINT, 0, (LPARAM)&pt);
-    if (hwndTool == 0)
-	return FALSE;
-
-    ScreenToClient32 (hwndTool, &pt);
-    nTool = TOOLTIPS_GetToolFromPoint (infoPtr, hwndTool, &pt);
-    TRACE (tooltips, "tool %d\n", nTool);
-
-    return (nTool != -1);
-}
-
-
-static LRESULT
-TOOLTIPS_Activate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-
-    infoPtr->bActive = (BOOL32)wParam;
-
-    if (infoPtr->bActive)
-	TRACE (tooltips, "activate!\n");
-
-    if (!(infoPtr->bActive) && (infoPtr->nCurrentTool != -1)) 
-	    TOOLTIPS_Hide (wndPtr, infoPtr);
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_AddTool32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
-    TTTOOL_INFO *toolPtr;
-
-    if (lpToolInfo == NULL) return FALSE;
-
-    TRACE (tooltips, "add tool (%x) %x %d%s!\n",
-	   wndPtr->hwndSelf, lpToolInfo->hwnd, lpToolInfo->uId,
-	   (lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : "");
-
-    if (infoPtr->uNumTools == 0) {
-	infoPtr->tools =
-	    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-		       sizeof(TTTOOL_INFO));
-	toolPtr = infoPtr->tools;
-    }
-    else {
-	TTTOOL_INFO *oldTools = infoPtr->tools;
-	infoPtr->tools =
-	    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-		       sizeof(TTTOOL_INFO) * (infoPtr->uNumTools + 1));
-	memcpy (infoPtr->tools, oldTools,
-		infoPtr->uNumTools * sizeof(TTTOOL_INFO));
-	HeapFree (GetProcessHeap (), 0, oldTools);
-	toolPtr = &infoPtr->tools[infoPtr->uNumTools];
-    }
-
-    infoPtr->uNumTools++;
-
-    /* copy tool data */
-    toolPtr->uFlags = lpToolInfo->uFlags;
-    toolPtr->hwnd   = lpToolInfo->hwnd;
-    toolPtr->uId    = lpToolInfo->uId;
-    toolPtr->rect   = lpToolInfo->rect;
-    toolPtr->hinst  = lpToolInfo->hinst;
-
-    if (lpToolInfo->hinst) {
-	TRACE (tooltips, "add string id %x!\n", (int)lpToolInfo->lpszText);
-	toolPtr->lpszText = lpToolInfo->lpszText;
-    }
-    else if (lpToolInfo->lpszText) {
-	if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACK32A) {
-	    TRACE (tooltips, "add CALLBACK!\n");
-	    toolPtr->lpszText = lpToolInfo->lpszText;
-	}
-	else {
-	    INT32 len = lstrlen32A (lpToolInfo->lpszText);
-	    TRACE (tooltips, "add text \"%s\"!\n", lpToolInfo->lpszText);
-	    toolPtr->lpszText =
-		HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len + 1);
-	    lstrcpy32A (toolPtr->lpszText, lpToolInfo->lpszText);
-	}
-    }
-
-    if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32A))
-	toolPtr->lParam = lpToolInfo->lParam;
-
-    /* install subclassing */
-    if (toolPtr->uFlags & TTF_SUBCLASS) {
-	if (toolPtr->uFlags & TTF_IDISHWND) {
-	    LPTT_SUBCLASS_INFO lpttsi =
-		(LPTT_SUBCLASS_INFO)GetProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
-	    if (lpttsi == NULL) {
-		lpttsi = (LPTT_SUBCLASS_INFO)HeapAlloc (GetProcessHeap(),
-		    HEAP_ZERO_MEMORY, sizeof(TT_SUBCLASS_INFO));
-		lpttsi->wpOrigProc = 
-		    (WNDPROC32)SetWindowLong32A ((HWND32)toolPtr->uId,
-		    GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc);
-		lpttsi->hwndToolTip = wndPtr->hwndSelf;
-		lpttsi->uRefCount++;
-		SetProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP,
-			    (HANDLE32)lpttsi);
-	    }
-	    else
-		ERR (tooltips, "A window tool must only be listed once!\n");
-	}
-	else {
-	    LPTT_SUBCLASS_INFO lpttsi =
-		(LPTT_SUBCLASS_INFO)GetProp32A (toolPtr->hwnd, TT_SUBCLASS_PROP);
-	    if (lpttsi == NULL) {
-		lpttsi = (LPTT_SUBCLASS_INFO)HeapAlloc (GetProcessHeap(),
-		    HEAP_ZERO_MEMORY, sizeof(TT_SUBCLASS_INFO));
-		lpttsi->wpOrigProc = 
-		    (WNDPROC32)SetWindowLong32A (toolPtr->hwnd,
-		    GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc);
-		lpttsi->hwndToolTip = wndPtr->hwndSelf;
-		lpttsi->uRefCount++;
-		SetProp32A (toolPtr->hwnd, TT_SUBCLASS_PROP, (HANDLE32)lpttsi);
-	    }
-	    else
-		lpttsi->uRefCount++;
-	}
-	TRACE (tooltips, "subclassing installed!\n");
-    }
-
-    return TRUE;
-}
-
-
-// << TOOLTIPS_AddTool32W >>
-
-
-static LRESULT
-TOOLTIPS_DelTool32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
-    TTTOOL_INFO *toolPtr;
-    INT32 nTool;
-
-    if (lpToolInfo == NULL) return 0;
-    if (infoPtr->uNumTools == 0) return 0;
-
-    nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
-    if (nTool == -1) return 0;
-
-    TRACE (tooltips, "tool %d\n", nTool);
-
-    /* delete text string */
-    toolPtr = &infoPtr->tools[nTool]; 
-    if ((toolPtr->hinst) && (toolPtr->lpszText)) {
-	if (toolPtr->lpszText != LPSTR_TEXTCALLBACK32A)
-	    HeapFree (GetProcessHeap (), 0, toolPtr->lpszText);
-    }
-
-    /* remove subclassing */
-    if (toolPtr->uFlags & TTF_SUBCLASS) {
-	if (toolPtr->uFlags & TTF_IDISHWND) {
-	    LPTT_SUBCLASS_INFO lpttsi =
-		(LPTT_SUBCLASS_INFO)GetProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
-	    if (lpttsi) {
-		SetWindowLong32A ((HWND32)toolPtr->uId, GWL_WNDPROC,
-				  (LONG)lpttsi->wpOrigProc);
-		RemoveProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
-		HeapFree (GetProcessHeap(), 0, &lpttsi);
-	    }
-	    else
-		ERR (tooltips, "Invalid data handle!\n");
-	}
-	else {
-	    LPTT_SUBCLASS_INFO lpttsi =
-		(LPTT_SUBCLASS_INFO)GetProp32A (toolPtr->hwnd, TT_SUBCLASS_PROP);
-	    if (lpttsi) {
-		if (lpttsi->uRefCount == 1) {
-		    SetWindowLong32A ((HWND32)toolPtr->uId, GWL_WNDPROC,
-				      (LONG)lpttsi->wpOrigProc);
-		    RemoveProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
-		    HeapFree (GetProcessHeap(), 0, &lpttsi);
-		}
-		else
-		    lpttsi->uRefCount--;
-	    }
-	    else
-		ERR (tooltips, "Invalid data handle!\n");
-	}
-    }
-
-    /* delete tool from tool list */
-    if (infoPtr->uNumTools == 1) {
-	HeapFree (GetProcessHeap (), 0, infoPtr->tools);
-	infoPtr->tools = NULL;
-    }
-    else {
-	TTTOOL_INFO *oldTools = infoPtr->tools;
-	infoPtr->tools =
-	    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-		       sizeof(TTTOOL_INFO) * (infoPtr->uNumTools - 1));
-
-	if (nTool > 0)
-	    memcpy (&infoPtr->tools[0], &oldTools[0],
-		    nTool * sizeof(TTTOOL_INFO));
-
-	if (nTool < infoPtr->uNumTools - 1)
-	    memcpy (&infoPtr->tools[nTool], &oldTools[nTool + 1],
-		    (infoPtr->uNumTools - nTool - 1) * sizeof(TTTOOL_INFO));
-
-	HeapFree (GetProcessHeap (), 0, oldTools);
-    }
-
-    infoPtr->uNumTools--;
-
-    return 0;
-}
-
-
-// << TOOLTIPS_DelTool32W >>
-
-
-static LRESULT
-TOOLTIPS_EnumTools32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    UINT32 uIndex = (UINT32)wParam;
-    LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
-    TTTOOL_INFO *toolPtr;
-
-    if (uIndex >= infoPtr->uNumTools) return FALSE;
-    if (lpToolInfo == NULL) return FALSE;
-
-    TRACE (tooltips, "index=%u\n", uIndex);
-
-    toolPtr = &infoPtr->tools[uIndex];
-
-    /* copy tool data */
-    lpToolInfo->uFlags   = toolPtr->uFlags;
-    lpToolInfo->hwnd     = toolPtr->hwnd;
-    lpToolInfo->uId      = toolPtr->uId;
-    lpToolInfo->rect     = toolPtr->rect;
-    lpToolInfo->hinst    = toolPtr->hinst;
-    lpToolInfo->lpszText = toolPtr->lpszText;
-
-    if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32A))
-	lpToolInfo->lParam = toolPtr->lParam;
-
-    return TRUE;
-}
-
-
-// << TOOLTIPS_EnumTools32W >>
-
-
-static LRESULT
-TOOLTIPS_GetCurrentTool32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPTTTOOLINFO32A lpti = (LPTTTOOLINFO32A)lParam;
-    TTTOOL_INFO *toolPtr;
-
-    if (lpti) {
-	if (infoPtr->nCurrentTool > -1) {
-	    toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
-
-	    /* copy tool data */
-	    lpti->uFlags   = toolPtr->uFlags;
-	    lpti->rect     = toolPtr->rect;
-	    lpti->hinst    = toolPtr->hinst;
-	    lpti->lpszText = toolPtr->lpszText;
-
-	    if (lpti->cbSize >= sizeof(TTTOOLINFO32A))
-		lpti->lParam = toolPtr->lParam;
-
-	    return TRUE;
-	}
-	else
-	    return FALSE;
-    }
-    else
-	return (infoPtr->nCurrentTool != -1);
-
-    return FALSE;
-}
-
-
-// << TOOLTIPS_GetCurrentTool32W >>
-
-
-static LRESULT
-TOOLTIPS_GetDelayTime (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-
-    switch (wParam) {
-	case TTDT_AUTOMATIC:
-	    return infoPtr->nAutomaticTime;
-
-	case TTDT_RESHOW:
-	    return infoPtr->nReshowTime;
-
-	case TTDT_AUTOPOP:
-	    return infoPtr->nAutoPopTime;
-
-	case TTDT_INITIAL:
-	    return infoPtr->nInitialTime;
-    }
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_GetMargin (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPRECT32 lpRect = (LPRECT32)lParam;
-
-    lpRect->left   = infoPtr->rcMargin.left;
-    lpRect->right  = infoPtr->rcMargin.right;
-    lpRect->bottom = infoPtr->rcMargin.bottom;
-    lpRect->top    = infoPtr->rcMargin.top;
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_GetMaxTipWidth (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-
-    return infoPtr->nMaxTipWidth;
-}
-
-
-static LRESULT
-TOOLTIPS_GetText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPTTTOOLINFO32A lpti = (LPTTTOOLINFO32A)lParam;
-    INT32 nTool;
-
-    if (!(lpti)) return 0;
-    if (lpti->cbSize < sizeof(TTTOOLINFO32A)) return 0;
-
-    nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpti);
-    if (nTool == -1) return 0;
-
-    lstrcpy32A (lpti->lpszText, infoPtr->tools[nTool].lpszText);
-
-    return 0;
-}
-
-
-// << TOOLTIPS_GetText32W >>
-
-
-static LRESULT
-TOOLTIPS_GetTipBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    return infoPtr->clrBk;
-}
-
-
-static LRESULT
-TOOLTIPS_GetTipTextColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    return infoPtr->clrText;
-}
-
-
-static LRESULT
-TOOLTIPS_GetToolCount (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    return infoPtr->uNumTools;
-}
-
-
-static LRESULT
-TOOLTIPS_GetToolInfo32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
-    TTTOOL_INFO *toolPtr;
-    INT32 nTool;
-
-    if (lpToolInfo == NULL) return FALSE;
-    if (infoPtr->uNumTools == 0) return FALSE;
-
-    nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
-    if (nTool == -1) return FALSE;
-
-    TRACE (tooltips, "tool %d\n", nTool);
-
-    toolPtr = &infoPtr->tools[nTool];
-
-    /* copy tool data */
-    lpToolInfo->uFlags   = toolPtr->uFlags;
-    lpToolInfo->rect     = toolPtr->rect;
-    lpToolInfo->hinst    = toolPtr->hinst;
-    lpToolInfo->lpszText = toolPtr->lpszText;
-
-    if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32A))
-	lpToolInfo->lParam = toolPtr->lParam;
-
-    return TRUE;
-}
-
-
-// << TOOLTIPS_GetToolInfo32W >>
-
-
-static LRESULT
-TOOLTIPS_HitTest32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPTTHITTESTINFO32A lptthit = (LPTTHITTESTINFO32A)lParam;
-    TTTOOL_INFO *toolPtr;
-    INT32 nTool;
-
-    if (lptthit == 0)
-	return FALSE;
-
-    nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lptthit->hwnd, &lptthit->pt);
-    if (nTool == -1)
-	return FALSE;
-
-    TRACE (tooltips, "tool %d!\n", nTool);
-
-    /* copy tool data */
-    toolPtr = &infoPtr->tools[nTool];
-    lptthit->ti.cbSize   = sizeof(TTTOOLINFO32A);
-    lptthit->ti.uFlags   = toolPtr->uFlags;
-    lptthit->ti.hwnd     = toolPtr->hwnd;
-    lptthit->ti.uId      = toolPtr->uId;
-    lptthit->ti.rect     = toolPtr->rect;
-    lptthit->ti.hinst    = toolPtr->hinst;
-    lptthit->ti.lpszText = toolPtr->lpszText;
-    lptthit->ti.lParam   = toolPtr->lParam;
-
-    return TRUE;
-}
-
-
-// << TOOLTIPS_HitTest32W >>
-
-
-static LRESULT
-TOOLTIPS_NewToolRect32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPTTTOOLINFO32A lpti = (LPTTTOOLINFO32A)lParam;
-    INT32 nTool;
-
-    if (!(lpti)) return 0;
-#if 0
-    if (lpti->cbSize < sizeof(TTTOOLINFO32A)) return 0;
-#endif
-
-    nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpti);
-    if (nTool == -1) return 0;
-
-    infoPtr->tools[nTool].rect = lpti->rect;
-
-    return 0;
-}
-
-
-// << TOOLTIPS_NewToolRect32W >>
-
-
-static LRESULT
-TOOLTIPS_Pop (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-
-    TOOLTIPS_Hide (wndPtr, infoPtr);
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_RelayEvent (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPMSG32 lpMsg = (LPMSG32)lParam;
-    POINT32 pt;
-
-    if (lParam == NULL) {
-	ERR (tooltips, "lpMsg == NULL!\n");
-	return 0;
-    }
-
-    switch (lpMsg->message) {
-	case WM_LBUTTONDOWN:
-	case WM_LBUTTONUP:
-	case WM_MBUTTONDOWN:
-	case WM_MBUTTONUP:
-	case WM_RBUTTONDOWN:
-	case WM_RBUTTONUP:
-	    pt = lpMsg->pt;
-	    ScreenToClient32 (lpMsg->hwnd, &pt);
-	    infoPtr->nOldTool = infoPtr->nTool;
-	    infoPtr->nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lpMsg->hwnd, &pt);
-	    TRACE (tooltips, "tool (%x) %d %d\n",
-		   wndPtr->hwndSelf, infoPtr->nOldTool, infoPtr->nTool);
-	    TOOLTIPS_Hide (wndPtr, infoPtr);
-	    break;
-
-	case WM_MOUSEMOVE:
-	    pt = lpMsg->pt;
-	    ScreenToClient32 (lpMsg->hwnd, &pt);
-	    infoPtr->nOldTool = infoPtr->nTool;
-	    infoPtr->nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lpMsg->hwnd, &pt);
-	    TRACE (tooltips, "tool (%x) %d %d\n",
-		   wndPtr->hwndSelf, infoPtr->nOldTool, infoPtr->nTool);
-	    TRACE (tooltips, "WM_MOUSEMOVE (%04x %d %d)\n",
-		   wndPtr->hwndSelf, pt.x, pt.y);
-	    if ((infoPtr->bActive) && (infoPtr->nTool != infoPtr->nOldTool)) {
-		if (infoPtr->nOldTool == -1) {
-		    SetTimer32 (wndPtr->hwndSelf, ID_TIMER1,
-				infoPtr->nInitialTime, 0);
-		    TRACE (tooltips, "timer 1 started!\n");
-		}
-		else {
-		    TOOLTIPS_Hide (wndPtr, infoPtr);
-		    SetTimer32 (wndPtr->hwndSelf, ID_TIMER1,
-				infoPtr->nReshowTime, 0);
-		    TRACE (tooltips, "timer 2 started!\n");
-		}
-	    }
-	    if (infoPtr->nCurrentTool != -1) {
-		SetTimer32 (wndPtr->hwndSelf, ID_TIMER3, 100, 0);
-		TRACE (tooltips, "timer 3 started!\n");
-	    }
-	    break;
-    }
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_SetDelayTime (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    INT32 nTime = (INT32)LOWORD(lParam);
-
-    switch (wParam) {
-	case TTDT_AUTOMATIC:
-	    if (nTime == 0) {
-		infoPtr->nAutomaticTime = 500;
-		infoPtr->nReshowTime    = 100;
-		infoPtr->nAutoPopTime   = 5000;
-		infoPtr->nInitialTime   = 500;
-	    }
-	    else {
-		infoPtr->nAutomaticTime = nTime;
-		infoPtr->nReshowTime    = nTime / 5;
-		infoPtr->nAutoPopTime   = nTime * 10;
-		infoPtr->nInitialTime   = nTime;
-	    }
-	    break;
-
-	case TTDT_RESHOW:
-	    infoPtr->nReshowTime = nTime;
-	    break;
-
-	case TTDT_AUTOPOP:
-	    infoPtr->nAutoPopTime = nTime;
-	    break;
-
-	case TTDT_INITIAL:
-	    infoPtr->nInitialTime = nTime;
-	    break;
-    }
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_SetMargin (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPRECT32 lpRect = (LPRECT32)lParam;
-
-    infoPtr->rcMargin.left   = lpRect->left;
-    infoPtr->rcMargin.right  = lpRect->right;
-    infoPtr->rcMargin.bottom = lpRect->bottom;
-    infoPtr->rcMargin.top    = lpRect->top;
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_SetMaxTipWidth (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    INT32 nTemp = infoPtr->nMaxTipWidth;
-
-    infoPtr->nMaxTipWidth = (INT32)lParam;
-
-    return nTemp;
-}
-
-
-static LRESULT
-TOOLTIPS_SetTipBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-
-    infoPtr->clrBk = (COLORREF)wParam;
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_SetTipTextColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-
-    infoPtr->clrText = (COLORREF)wParam;
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_SetToolInfo32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
-    TTTOOL_INFO *toolPtr;
-    INT32 nTool;
-
-    if (lpToolInfo == NULL) return 0;
-
-    nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
-    if (nTool == -1) return 0;
-
-    TRACE (tooltips, "tool %d\n", nTool);
-
-    toolPtr = &infoPtr->tools[nTool];
-
-    /* copy tool data */
-    toolPtr->uFlags = lpToolInfo->uFlags;
-    toolPtr->hwnd   = lpToolInfo->hwnd;
-    toolPtr->uId    = lpToolInfo->uId;
-    toolPtr->rect   = lpToolInfo->rect;
-    toolPtr->hinst  = lpToolInfo->hinst;
-
-    if (lpToolInfo->hinst) {
-	toolPtr->lpszText = lpToolInfo->lpszText;
-    }
-    else if (lpToolInfo->lpszText) {
-	if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACK32A)
-	    toolPtr->lpszText = lpToolInfo->lpszText;
-	else {
-	    INT32 len = lstrlen32A (lpToolInfo->lpszText);
-	    HeapFree (GetProcessHeap (), 0, toolPtr->lpszText);
-	    toolPtr->lpszText =
-		HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len + 1);
-	    lstrcpy32A (toolPtr->lpszText, lpToolInfo->lpszText);
-	}
-    }
-
-    if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32A))
-	toolPtr->lParam = lpToolInfo->lParam;
-
-    return 0;
-}
-
-
-// << TOOLTIPS_SetToolInfo32W >>
-
-
-static LRESULT
-TOOLTIPS_TrackActivate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
-
-    if ((BOOL32)wParam) {
-	/* activate */
-	infoPtr->nTrackTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
-	if (infoPtr->nTrackTool != -1) {
-	    infoPtr->bTrackActive = TRUE;
-
-	    /* FIXME : show tool tip */
-	}
-    }
-    else {
-	/* deactivate */
-	/* FIXME : hide tool tip */
-
-	infoPtr->bTrackActive = FALSE;
-	infoPtr->nTrackTool = -1;
-    }
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_TrackPosition (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-
-    infoPtr->xTrackPos = (INT32)LOWORD(lParam);
-    infoPtr->yTrackPos = (INT32)HIWORD(lParam);
-
-    if (infoPtr->bTrackActive) {
-
-	FIXME (tooltips, "set position!\n");
-    }
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_Update (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-
-    if (infoPtr->nCurrentTool != -1)
-	UpdateWindow32 (wndPtr->hwndSelf);
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_UpdateTipText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
-    TTTOOL_INFO *toolPtr;
-    INT32 nTool;
-
-    if (lpToolInfo == NULL) return 0;
-
-    nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
-    if (nTool == -1) return 0;
-
-    TRACE (tooltips, "tool %d\n", nTool);
-
-    toolPtr = &infoPtr->tools[nTool];
-
-    /* copy tool text */
-    toolPtr->hinst  = lpToolInfo->hinst;
-
-    if (lpToolInfo->hinst) {
-	toolPtr->lpszText = lpToolInfo->lpszText;
-    }
-    else if (lpToolInfo->lpszText) {
-	if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACK32A)
-	    toolPtr->lpszText = lpToolInfo->lpszText;
-	else {
-	    INT32 len = lstrlen32A (lpToolInfo->lpszText);
-	    HeapFree (GetProcessHeap (), 0, toolPtr->lpszText);
-	    toolPtr->lpszText =
-		HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len + 1);
-	    lstrcpy32A (toolPtr->lpszText, lpToolInfo->lpszText);
-	}
-    }
-
-    return 0;
-}
-
-
-// << TOOLTIPS_UpdateTipText32W >>
-
-
-static LRESULT
-TOOLTIPS_WindowFromPoint (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    return WindowFromPoint32 (*((LPPOINT32)lParam));
-}
-
-
-
-static LRESULT
-TOOLTIPS_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr;
-    LOGFONT32A logFont;
-
-    /* allocate memory for info structure */
-    infoPtr = (TOOLTIPS_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-					  sizeof(TOOLTIPS_INFO));
-    wndPtr->wExtra[0] = (DWORD)infoPtr;
-
-    if (infoPtr == NULL) {
-	ERR (tooltips, "could not allocate info memory!\n");
-	return 0;
-    }
-
-    /* initialize info structure */
-    infoPtr->bActive = TRUE;
-    infoPtr->bTrackActive = FALSE;
-    infoPtr->clrBk   = GetSysColor32 (COLOR_INFOBK);
-    infoPtr->clrText = GetSysColor32 (COLOR_INFOTEXT);
-
-    SystemParametersInfo32A( SPI_GETICONTITLELOGFONT, 0, &logFont, 0 );
-    infoPtr->hFont = CreateFontIndirect32A( &logFont );
-
-    infoPtr->nMaxTipWidth = -1;
-    infoPtr->nTool = -1;
-    infoPtr->nOldTool = -1;
-    infoPtr->nCurrentTool = -1;
-    infoPtr->nTrackTool = -1;
-
-    infoPtr->nAutomaticTime = 500;
-    infoPtr->nReshowTime    = 100;
-    infoPtr->nAutoPopTime   = 5000;
-    infoPtr->nInitialTime   = 500;
-
-    SetWindowPos32 (wndPtr->hwndSelf, HWND_TOP, 0, 0, 0, 0, SWP_HIDEWINDOW);
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    TTTOOL_INFO *toolPtr;
-
-    /* free tools */
-    if (infoPtr->tools) {
-	INT32 i;
-	for (i = 0; i < infoPtr->uNumTools; i++) {
-	    toolPtr = &infoPtr->tools[i];
-	    if ((toolPtr->hinst) && (toolPtr->lpszText)) {
-		if (toolPtr->lpszText != LPSTR_TEXTCALLBACK32A)
-		    HeapFree (GetProcessHeap (), 0, toolPtr->lpszText);
-	    }
-
-	    /* remove subclassing */
-	    if (toolPtr->uFlags & TTF_SUBCLASS) {
-		LPTT_SUBCLASS_INFO lpttsi;
-
-		if (toolPtr->uFlags & TTF_IDISHWND)
-		    lpttsi = (LPTT_SUBCLASS_INFO)GetProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
-		else
-		    lpttsi = (LPTT_SUBCLASS_INFO)GetProp32A (toolPtr->hwnd, TT_SUBCLASS_PROP);
-
-		if (lpttsi) {
-		    SetWindowLong32A ((HWND32)toolPtr->uId, GWL_WNDPROC,
-				      (LONG)lpttsi->wpOrigProc);
-		    RemoveProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
-		    HeapFree (GetProcessHeap(), 0, &lpttsi);
-		}
-	    }
-	}
-	HeapFree (GetProcessHeap (), 0, infoPtr->tools);
-    }
-
-    /* delete font */
-    DeleteObject32 (infoPtr->hFont);
-
-    /* free tool tips info data */
-    HeapFree (GetProcessHeap (), 0, infoPtr);
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    RECT32 rect;
-    HBRUSH32 hBrush;
-
-    hBrush = CreateSolidBrush32 (infoPtr->clrBk);
-    GetClientRect32 (wndPtr->hwndSelf, &rect);
-    FillRect32 ((HDC32)wParam, &rect, hBrush);
-    DeleteObject32 (hBrush);
-
-    return FALSE;
-}
-
-
-static LRESULT
-TOOLTIPS_GetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-
-    return infoPtr->hFont;
-}
-
-
-static LRESULT
-TOOLTIPS_MouseMove (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-
-    TOOLTIPS_Hide (wndPtr, infoPtr);
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_NcCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    wndPtr->dwStyle &= 0x0000FFFF;
-    wndPtr->dwStyle |= (WS_POPUP | WS_BORDER);
-
-    return TRUE;
-}
-
-
-static LRESULT
-TOOLTIPS_Paint (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    HDC32 hdc;
-    PAINTSTRUCT32 ps;
-
-    hdc = wParam==0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
-    TOOLTIPS_Refresh (wndPtr, hdc);
-    if (!wParam)
-	EndPaint32 (wndPtr->hwndSelf, &ps);
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_SetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-
-    infoPtr->hFont = (HFONT32)wParam;
-
-    if ((LOWORD(lParam)) & (infoPtr->nCurrentTool != -1)) {
-	FIXME (tooltips, "full redraw needed!\n");
-    }
-
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_Timer (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-
-    TRACE (tooltips, "timer %d (%x) expired!\n", wParam, wndPtr->hwndSelf);
-
-    switch (wParam)
-    {
-	case ID_TIMER1:
-	    KillTimer32 (wndPtr->hwndSelf, ID_TIMER1);
-	    TOOLTIPS_Show (wndPtr, infoPtr);
-	    break;
-
-	case ID_TIMER2:
-	    TOOLTIPS_Hide (wndPtr, infoPtr);
-	    break;
-
-	case ID_TIMER3:
-	    KillTimer32 (wndPtr->hwndSelf, ID_TIMER3);
-	    if (TOOLTIPS_CheckTool (wndPtr) == FALSE) {
-		infoPtr->nTool = -1;
-		infoPtr->nOldTool = -1;
-		TOOLTIPS_Hide (wndPtr, infoPtr);
-	    }
-	    break;
-    }
-    return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_WinIniChange (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LOGFONT32A logFont;
-
-    infoPtr->clrBk   = GetSysColor32 (COLOR_INFOBK);
-    infoPtr->clrText = GetSysColor32 (COLOR_INFOTEXT);
-
-    DeleteObject32 (infoPtr->hFont);
-    SystemParametersInfo32A( SPI_GETICONTITLELOGFONT, 0, &logFont, 0 );
-    infoPtr->hFont = CreateFontIndirect32A( &logFont );
-
-    return 0;
-}
-
-
-LRESULT CALLBACK
-TOOLTIPS_SubclassProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
-{
-    LPTT_SUBCLASS_INFO lpttsi =
-	(LPTT_SUBCLASS_INFO)GetProp32A (hwnd, TT_SUBCLASS_PROP);
-    WND *wndPtr;
-    TOOLTIPS_INFO *infoPtr;
-    UINT32 nTool;
-
-    switch (uMsg) {
-	case WM_LBUTTONDOWN:
-	case WM_LBUTTONUP:
-	case WM_MBUTTONDOWN:
-	case WM_MBUTTONUP:
-	case WM_RBUTTONDOWN:
-	case WM_RBUTTONUP:
-	    {
-		wndPtr = WIN_FindWndPtr(lpttsi->hwndToolTip);
-		infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-		nTool = TOOLTIPS_GetToolFromMessage (infoPtr, hwnd);
-
-		TRACE (tooltips, "subclassed mouse message %04x\n", uMsg);
-		infoPtr->nOldTool = infoPtr->nTool;
-		infoPtr->nTool = nTool;
-		TOOLTIPS_Hide (wndPtr, infoPtr);
-	    }
-	    break;
-
-	case WM_MOUSEMOVE:
-	    {
-		wndPtr = WIN_FindWndPtr(lpttsi->hwndToolTip);
-		infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-		nTool = TOOLTIPS_GetToolFromMessage (infoPtr, hwnd);
-
-		TRACE (tooltips, "subclassed WM_MOUSEMOVE\n");
-		infoPtr->nOldTool = infoPtr->nTool;
-		infoPtr->nTool = nTool;
-
-		if ((infoPtr->bActive) &&
-		    (infoPtr->nTool != infoPtr->nOldTool)) {
-		    if (infoPtr->nOldTool == -1) {
-			SetTimer32 (wndPtr->hwndSelf, ID_TIMER1,
-				    infoPtr->nInitialTime, 0);
-			TRACE (tooltips, "timer 1 started!\n");
-		    }
-		    else {
-			TOOLTIPS_Hide (wndPtr, infoPtr);
-			SetTimer32 (wndPtr->hwndSelf, ID_TIMER1,
-				infoPtr->nReshowTime, 0);
-			TRACE (tooltips, "timer 2 started!\n");
-		    }
-		}
-		if (infoPtr->nCurrentTool != -1) {
-		    SetTimer32 (wndPtr->hwndSelf, ID_TIMER3, 100, 0);
-		    TRACE (tooltips, "timer 3 started!\n");
-		}
-	    }
-	    break;
-    }
-
-    return CallWindowProc32A (lpttsi->wpOrigProc, hwnd, uMsg, wParam, lParam);
-}
-
-
-LRESULT CALLBACK
-TOOLTIPS_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
-{
-    WND *wndPtr = WIN_FindWndPtr(hwnd);
-
-    switch (uMsg)
-    {
-	case TTM_ACTIVATE:
-	    return TOOLTIPS_Activate (wndPtr, wParam, lParam);
-
-	case TTM_ADDTOOL32A:
-	    return TOOLTIPS_AddTool32A (wndPtr, wParam, lParam);
-
-//	case TTM_ADDTOOL32W:
-
-	case TTM_DELTOOL32A:
-	    return TOOLTIPS_DelTool32A (wndPtr, wParam, lParam);
-
-//	case TTM_DELTOOL32W:
-
-	case TTM_ENUMTOOLS32A:
-	    return TOOLTIPS_EnumTools32A (wndPtr, wParam, lParam);
-
-//	case TTM_ENUMTOOLS32W:
-
-	case TTM_GETCURRENTTOOL32A:
-	    return TOOLTIPS_GetCurrentTool32A (wndPtr, wParam, lParam);
-
-//	case TTM_GETCURRENTTOOL32W:
-
-	case TTM_GETDELAYTIME:
-	    return TOOLTIPS_GetDelayTime (wndPtr, wParam, lParam);
-
-	case TTM_GETMARGIN:
-	    return TOOLTIPS_GetMargin (wndPtr, wParam, lParam);
-
-	case TTM_GETMAXTIPWIDTH:
-	    return TOOLTIPS_GetMaxTipWidth (wndPtr, wParam, lParam);
-
-	case TTM_GETTEXT32A:
-	    return TOOLTIPS_GetText32A (wndPtr, wParam, lParam);
-
-//	case TTM_GETTEXT32W:
-
-	case TTM_GETTIPBKCOLOR:
-	    return TOOLTIPS_GetTipBkColor (wndPtr, wParam, lParam);
-
-	case TTM_GETTIPTEXTCOLOR:
-	    return TOOLTIPS_GetTipTextColor (wndPtr, wParam, lParam);
-
-	case TTM_GETTOOLCOUNT:
-	    return TOOLTIPS_GetToolCount (wndPtr, wParam, lParam);
-
-	case TTM_GETTOOLINFO32A:
-	    return TOOLTIPS_GetToolInfo32A (wndPtr, wParam, lParam);
-
-//	case TTM_GETTOOLINFO32W:
-
-	case TTM_HITTEST32A:
-	    return TOOLTIPS_HitTest32A (wndPtr, wParam, lParam);
-
-//	case TTM_HITTEST32W:
-
-	case TTM_NEWTOOLRECT32A:
-	    return TOOLTIPS_NewToolRect32A (wndPtr, wParam, lParam);
-
-//	case TTM_NEWTOOLRECT32W:
-
-	case TTM_POP:
-	    return TOOLTIPS_Pop (wndPtr, wParam, lParam);
-
-	case TTM_RELAYEVENT:
-	    return TOOLTIPS_RelayEvent (wndPtr, wParam, lParam);
-
-	case TTM_SETDELAYTIME:
-	    return TOOLTIPS_SetDelayTime (wndPtr, wParam, lParam);
-
-	case TTM_SETMARGIN:
-	    return TOOLTIPS_SetMargin (wndPtr, wParam, lParam);
-
-	case TTM_SETMAXTIPWIDTH:
-	    return TOOLTIPS_SetMaxTipWidth (wndPtr, wParam, lParam);
-
-	case TTM_SETTIPBKCOLOR:
-	    return TOOLTIPS_SetTipBkColor (wndPtr, wParam, lParam);
-
-	case TTM_SETTIPTEXTCOLOR:
-	    return TOOLTIPS_SetTipTextColor (wndPtr, wParam, lParam);
-
-	case TTM_SETTOOLINFO32A:
-	    return TOOLTIPS_SetToolInfo32A (wndPtr, wParam, lParam);
-
-//	case TTM_SETTOOLINFO32W:
-
-	case TTM_TRACKACTIVATE:
-	    return TOOLTIPS_TrackActivate (wndPtr, wParam, lParam);
-
-	case TTM_TRACKPOSITION:
-	    return TOOLTIPS_TrackPosition (wndPtr, wParam, lParam);
-
-	case TTM_UPDATE:
-	    return TOOLTIPS_Update (wndPtr, wParam, lParam);
-
-	case TTM_UPDATETIPTEXT32A:
-	    return TOOLTIPS_UpdateTipText32A (wndPtr, wParam, lParam);
-
-//	case TTM_UPDATETIPTEXT32W:
-
-	case TTM_WINDOWFROMPOINT:
-	    return TOOLTIPS_WindowFromPoint (wndPtr, wParam, lParam);
-
-
-	case WM_CREATE:
-	    return TOOLTIPS_Create (wndPtr, wParam, lParam);
-
-	case WM_DESTROY:
-	    return TOOLTIPS_Destroy (wndPtr, wParam, lParam);
-
-	case WM_ERASEBKGND:
-	    return TOOLTIPS_EraseBackground (wndPtr, wParam, lParam);
-
-	case WM_GETFONT:
-	    return TOOLTIPS_GetFont (wndPtr, wParam, lParam);
-
-//	case WM_GETTEXT:
-//	case WM_GETTEXTLENGTH:
-//	case WM_LBUTTONDOWN:
-//	case WM_MBUTTONDOWN:
-
-	case WM_MOUSEMOVE:
-	    return TOOLTIPS_MouseMove (wndPtr, wParam, lParam);
-
-	case WM_NCCREATE:
-	    return TOOLTIPS_NcCreate (wndPtr, wParam, lParam);
-
-//	case WM_NCHITTEST:
-//	case WM_NOTIFYFORMAT:
-
-	case WM_PAINT:
-	    return TOOLTIPS_Paint (wndPtr, wParam, lParam);
-
-//	case WM_PRINTCLIENT:
-//	case WM_RBUTTONDOWN:
-
-	case WM_SETFONT:
-	    return TOOLTIPS_SetFont (wndPtr, wParam, lParam);
-
-//	case WM_STYLECHANGED:
-
-	case WM_TIMER:
-	    return TOOLTIPS_Timer (wndPtr, wParam, lParam);
-
-	case WM_WININICHANGE:
-	    return TOOLTIPS_WinIniChange (wndPtr, wParam, lParam);
-
-	default:
-	    if (uMsg >= WM_USER)
-		ERR (tooltips, "unknown msg %04x wp=%08x lp=%08lx\n",
-		     uMsg, wParam, lParam);
-	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
-    }
-    return 0;
-}
-
-
-void
-TOOLTIPS_Register (void)
-{
-    WNDCLASS32A wndClass;
-
-    if (GlobalFindAtom32A (TOOLTIPS_CLASS32A)) return;
-
-    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
-    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS;
-    wndClass.lpfnWndProc   = (WNDPROC32)TOOLTIPS_WindowProc;
-    wndClass.cbClsExtra    = 0;
-    wndClass.cbWndExtra    = sizeof(TOOLTIPS_INFO *);
-    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
-    wndClass.hbrBackground = 0;
-    wndClass.lpszClassName = TOOLTIPS_CLASS32A;
- 
-    RegisterClass32A (&wndClass);
-}
diff --git a/controls/trackbar.c b/controls/trackbar.c
deleted file mode 100644
index 48e587b..0000000
--- a/controls/trackbar.c
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- * Trackbar control
- *
- * Copyright 1998 Eric Kohl
- *
- * NOTES
- *   This is just a dummy control. An author is needed! Any volunteers?
- *   I will only improve this control once in a while.
- *     Eric <ekohl@abo.rhein-zeitung.de>
- *
- * TODO:
- *   - All messages.
- *   - All notifications.
- */
-
-#include "windows.h"
-#include "commctrl.h"
-#include "trackbar.h"
-#include "heap.h"
-#include "win.h"
-#include "debug.h"
-
-
-#define TRACKBAR_GetInfoPtr(wndPtr) ((TRACKBAR_INFO *)wndPtr->wExtra[0])
-
-
-static VOID
-TRACKBAR_Refresh (WND *wndPtr, HDC32 hdc)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-    RECT32 rect;
-
-    GetClientRect32 (wndPtr->hwndSelf, &rect);
-
-    /* draw channel */
-    DrawEdge32 (hdc, &infoPtr->rcChannel, EDGE_SUNKEN, BF_RECT);
-
-    /* draw thumb */
-    if (!(wndPtr->dwStyle & TBS_NOTHUMB)) {
-
-    }
-
-    /* draw ticks */
-    if (!(wndPtr->dwStyle & TBS_NOTICKS)) {
-
-    }
-
-    if (infoPtr->bFocus)
-	DrawFocusRect32 (hdc, &rect);
-}
-
-
-static LRESULT
-TRACKBAR_ClearSel (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-
-    infoPtr->nSelMin = 0;
-    infoPtr->nSelMax = 0;
-
-    if ((BOOL32)wParam) {
-	HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
-	TRACKBAR_Refresh (wndPtr, hdc);
-	ReleaseDC32 (wndPtr->hwndSelf, hdc);
-    }
-
-    return 0;
-}
-
-
-// << TRACKBAR_ClearTics >>
-// << TRACKBAR_GetChannelRect >>
-
-
-static LRESULT
-TRACKBAR_GetLineSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-
-    return infoPtr->nLineSize;
-}
-
-
-// << TRACKBAR_GetNumTics >>
-
-
-static LRESULT
-TRACKBAR_GetPageSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-
-    return infoPtr->nPageSize;
-}
-
-
-static LRESULT
-TRACKBAR_GetPos (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-
-    return infoPtr->nPos;
-}
-
-
-// << TRACKBAR_GetPTics >>
-
-
-static LRESULT
-TRACKBAR_GetRangeMax (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-
-    return infoPtr->nRangeMax;
-}
-
-
-static LRESULT
-TRACKBAR_GetRangeMin (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-
-    return infoPtr->nRangeMin;
-}
-
-
-static LRESULT
-TRACKBAR_GetSelEnd (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-
-    return infoPtr->nSelMax;
-}
-
-
-static LRESULT
-TRACKBAR_GetSelStart (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-
-    return infoPtr->nSelMin;
-}
-
-
-static LRESULT
-TRACKBAR_GetThumbLength (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-
-    return infoPtr->nThumbLen;
-}
-
-
-
-
-
-
-static LRESULT
-TRACKBAR_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr;
-
-    infoPtr = (TRACKBAR_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-					  sizeof(TRACKBAR_INFO));
-    wndPtr->wExtra[0] = (DWORD)infoPtr;
-
-
-    /* default values */
-    infoPtr->nRangeMin = 0;
-    infoPtr->nRangeMax = 100;
-    infoPtr->nLineSize = 1;
-    infoPtr->nPageSize = 20;
-    infoPtr->nSelMin   = 0;
-    infoPtr->nSelMax   = 0;
-    infoPtr->nPos      = 0;
-    infoPtr->nThumbLen = 23;   /* initial thumb length */
-
-
-    return 0;
-}
-
-
-static LRESULT
-TRACKBAR_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-
-
-
-
-    HeapFree (GetProcessHeap (), 0, infoPtr);
-
-    return 0;
-}
-
-
-static LRESULT
-TRACKBAR_KillFocus (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-    HDC32 hdc;
-
-    infoPtr->bFocus = FALSE;
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    TRACKBAR_Refresh (wndPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return 0;
-}
-
-
-static LRESULT
-TRACKBAR_LButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-
-    SetFocus32 (wndPtr->hwndSelf);
-
-    return 0;
-}
-
-
-static LRESULT
-TRACKBAR_Paint (WND *wndPtr, WPARAM32 wParam)
-{
-    HDC32 hdc;
-    PAINTSTRUCT32 ps;
-
-    hdc = wParam==0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
-    TRACKBAR_Refresh (wndPtr, hdc);
-    if(!wParam)
-	EndPaint32 (wndPtr->hwndSelf, &ps);
-    return 0;
-}
-
-
-static LRESULT
-TRACKBAR_SetFocus (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-    HDC32 hdc;
-
-    infoPtr->bFocus = TRUE;
-
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    TRACKBAR_Refresh (wndPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-
-    return 0;
-}
-
-
-static LRESULT
-TRACKBAR_Size (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-    RECT32 rect;
-
-    GetClientRect32 (wndPtr->hwndSelf, &rect);
-
-    /* calculate channel rect */
-    if (wndPtr->dwStyle & TBS_VERT) {
-	infoPtr->rcChannel.top = rect.top + 8;
-	infoPtr->rcChannel.bottom = rect.bottom - 8;
-
-	/* FIXME */
-	infoPtr->rcChannel.left = rect.left + 10;
-	infoPtr->rcChannel.right = rect.left + 14;
-
-    }
-    else {
-	infoPtr->rcChannel.left = rect.left + 8;
-	infoPtr->rcChannel.right = rect.right - 8;
-
-	/* FIXME */
-	if (wndPtr->dwStyle & TBS_BOTH) {
-	    infoPtr->rcChannel.top = rect.bottom / 2 - 2;
-	    infoPtr->rcChannel.bottom = rect.bottom / 2 + 2;
-
-	}
-	else if (wndPtr->dwStyle & TBS_TOP) {
-	    infoPtr->rcChannel.top = rect.top + 10;
-	    infoPtr->rcChannel.bottom = rect.top + 14;
-
-	}
-	else {
-	    /* TBS_BOTTOM */
-	    infoPtr->rcChannel.top = rect.bottom - 14;
-	    infoPtr->rcChannel.bottom = rect.bottom - 10;
-	}
-    }
-
-    return 0;
-}
-
-
-// << TRACKBAR_Timer >>
-// << TRACKBAR_WinIniChange >>
-
-
-LRESULT WINAPI
-TrackbarWindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
-{
-    WND *wndPtr = WIN_FindWndPtr(hwnd);
-
-    switch (uMsg)
-    {
-	case TBM_CLEARSEL:
-	    return TRACKBAR_ClearSel (wndPtr, wParam, lParam);
-
-//	case TBM_CLEARTICS:
-//	case TBM_GETBUDDY:
-//	case TBM_GETCHANNELRECT:
-
-	case TBM_GETLINESIZE:
-	    return TRACKBAR_GetLineSize (wndPtr, wParam, lParam);
-
-//	case TBM_GETNUMTICS:
-
-	case TBM_GETPAGESIZE:
-	    return TRACKBAR_GetPageSize (wndPtr, wParam, lParam);
-
-	case TBM_GETPOS:
-	    return TRACKBAR_GetPos (wndPtr, wParam, lParam);
-
-//	case TBM_GETPTICS:
-
-	case TBM_GETRANGEMAX:
-	    return TRACKBAR_GetRangeMax (wndPtr, wParam, lParam);
-
-	case TBM_GETRANGEMIN:
-	    return TRACKBAR_GetRangeMin (wndPtr, wParam, lParam);
-
-	case TBM_GETSELEND:
-	    return TRACKBAR_GetSelEnd (wndPtr, wParam, lParam);
-
-	case TBM_GETSELSTART:
-	    return TRACKBAR_GetSelStart (wndPtr, wParam, lParam);
-
-	case TBM_GETTHUMBLENGTH:
-	    return TRACKBAR_GetThumbLength (wndPtr, wParam, lParam);
-
-//	case TBM_GETTHUMBRECT:
-//	case TBM_GETTIC:
-//	case TBM_GETTICPOS:
-//	case TBM_GETTOOLTIPS:
-//	case TBM_GETUNICODEFORMAT:
-//	case TBM_SETBUDDY:
-//	case TBM_SETPAGESIZE:
-//	case TBM_SETPOS:
-//	case TBM_SETRANGE:
-//	case TBM_SETRANGEMAX:
-//	case TBM_SETRANGEMIN:
-//	case TBM_SETSEL:
-//	case TBM_SETSELEND:
-//	case TBM_SETSELSTART:
-//	case TBM_SETTHUMBLENGTH:
-//	case TBM_SETTIC:
-//	case TBM_SETTICFREQ:
-//	case TBM_SETTIPSIDE:
-//	case TBM_SETTOOLTIPS:
-//	case TBM_SETUNICODEFORMAT:
-
-
-//	case WM_CAPTURECHANGED:
-
-	case WM_CREATE:
-	    return TRACKBAR_Create (wndPtr, wParam, lParam);
-
-	case WM_DESTROY:
-	    return TRACKBAR_Destroy (wndPtr, wParam, lParam);
-
-//	case WM_ENABLE:
-
-//	case WM_ERASEBKGND:
-//	    return 0;
-
-	case WM_GETDLGCODE:
-	    return DLGC_WANTARROWS;
-
-//	case WM_KEYDOWN:
-
-//	case WM_KEYUP:
-
-	case WM_KILLFOCUS:
-	    return TRACKBAR_KillFocus (wndPtr, wParam, lParam);
-
-	case WM_LBUTTONDOWN:
-	    return TRACKBAR_LButtonDown (wndPtr, wParam, lParam);
-
-//	case WM_LBUTTONUP:
-
-//	case WM_MOUSEMOVE:
-//	    return TRACKBAR_MouseMove (wndPtr, wParam, lParam);
-
-	case WM_PAINT:
-	    return TRACKBAR_Paint (wndPtr, wParam);
-
-	case WM_SETFOCUS:
-	    return TRACKBAR_SetFocus (wndPtr, wParam, lParam);
-
-	case WM_SIZE:
-	    return TRACKBAR_Size (wndPtr, wParam, lParam);
-
-//	case WM_TIMER:
-
-//	case WM_WININICHANGE:
-
-	default:
-	    if (uMsg >= WM_USER)
-		ERR (trackbar, "unknown msg %04x wp=%08x lp=%08lx\n",
-		     uMsg, wParam, lParam);
-	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
-    }
-    return 0;
-}
-
-
-void
-TRACKBAR_Register (void)
-{
-    WNDCLASS32A wndClass;
-
-    if (GlobalFindAtom32A (TRACKBAR_CLASS32A)) return;
-
-    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
-    wndClass.style         = CS_GLOBALCLASS;
-    wndClass.lpfnWndProc   = (WNDPROC32)TrackbarWindowProc;
-    wndClass.cbClsExtra    = 0;
-    wndClass.cbWndExtra    = sizeof(TRACKBAR_INFO *);
-    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
-    wndClass.hbrBackground = (HBRUSH32)(COLOR_3DFACE + 1);
-    wndClass.lpszClassName = TRACKBAR_CLASS32A;
- 
-    RegisterClass32A (&wndClass);
-}
-
diff --git a/controls/treeview.c b/controls/treeview.c
deleted file mode 100644
index 992b5d8..0000000
--- a/controls/treeview.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Treeview control
- *
- * Copyright 1998 Eric Kohl
- *
- * NOTES
- *   This is just a dummy control. An author is needed! Any volunteers?
- *   I will only improve this control once in a while.
- *     Eric <ekohl@abo.rhein-zeitung.de>
- *
- * TODO:
- *   - All messages.
- *   - All notifications.
- */
-
-#include "windows.h"
-#include "commctrl.h"
-#include "treeview.h"
-#include "heap.h"
-#include "win.h"
-#include "debug.h"
-
-
-#define TREEVIEW_GetInfoPtr(wndPtr) ((TREEVIEW_INFO *)wndPtr->wExtra[0])
-
-
-
-static LRESULT
-TREEVIEW_SetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(wndPtr);
-    HIMAGELIST himlTemp;
-
-    if ((INT32)wParam == TVSIL_NORMAL) {
-	himlTemp = infoPtr->himlNormal;
-	infoPtr->himlNormal = (HIMAGELIST)lParam;
-    }
-    else if ((INT32)wParam == TVSIL_STATE) {
-	himlTemp = infoPtr->himlState;
-	infoPtr->himlState = (HIMAGELIST)lParam;
-    }
-    else
-	return 0;
-
-    return (LRESULT)himlTemp;
-}
-
-
-
-static LRESULT
-TREEVIEW_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TREEVIEW_INFO *infoPtr;
-
-    /* allocate memory for info structure */
-    infoPtr = (TREEVIEW_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-                                   sizeof(TREEVIEW_INFO));
-    wndPtr->wExtra[0] = (DWORD)infoPtr;
-
-    if (infoPtr == NULL) {
-	ERR (treeview, "could not allocate info memory!\n");
-	return 0;
-    }
-
-    if ((TREEVIEW_INFO*)wndPtr->wExtra[0] != infoPtr) {
-	ERR (treeview, "pointer assignment error!\n");
-	return 0;
-    }
-
-    /* set default settings */
-    infoPtr->clrBk = GetSysColor32 (COLOR_WINDOW);
-    infoPtr->clrText = GetSysColor32 (COLOR_BTNTEXT);
-    infoPtr->himlNormal = NULL;
-    infoPtr->himlState = NULL;
-
-
-    return 0;
-}
-
-
-static LRESULT
-TREEVIEW_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(wndPtr);
-
-
-
-
-    /* free tree view info data */
-    HeapFree (GetProcessHeap (), 0, infoPtr);
-
-    return 0;
-}
-
-
-static LRESULT
-TREEVIEW_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-    TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(wndPtr);
-    HBRUSH32 hBrush = CreateSolidBrush32 (infoPtr->clrBk);
-    RECT32 rect;
-
-    GetClientRect32 (wndPtr->hwndSelf, &rect);
-    FillRect32 ((HDC32)wParam, &rect, hBrush);
-    DeleteObject32 (hBrush);
-    return TRUE;
-}
-
-
-
-LRESULT WINAPI
-TREEVIEW_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
-{
-    WND *wndPtr = WIN_FindWndPtr(hwnd);
-
-    switch (uMsg)
-    {
-
-    case TVM_INSERTITEMA:
-      FIXME (treeview, "Unimplemented msg TVM_INSERTITEMA\n");
-      return 0;
-
-    case TVM_INSERTITEMW:
-      FIXME (treeview, "Unimplemented msg TVM_INSERTITEMW\n");
-      return 0;
-
-    case TVM_DELETEITEM:
-      FIXME (treeview, "Unimplemented msg TVM_DELETEITEM\n");
-      return 0;
-
-    case TVM_EXPAND:
-      FIXME (treeview, "Unimplemented msg TVM_EXPAND\n");
-      return 0;
-
-    case TVM_GETITEMRECT:
-      FIXME (treeview, "Unimplemented msg TVM_GETITEMRECT\n");
-      return 0;
-
-    case TVM_GETCOUNT:
-      FIXME (treeview, "Unimplemented msg TVM_GETCOUNT\n");
-      return 0;
-
-    case TVM_GETINDENT:
-      FIXME (treeview, "Unimplemented msg TVM_GETINDENT\n");
-      return 0;
-
-    case TVM_SETINDENT:
-      FIXME (treeview, "Unimplemented msg TVM_SETINDENT\n");
-      return 0;
-
-    case TVM_GETIMAGELIST:
-      FIXME (treeview, "Unimplemented msg TVM_GETIMAGELIST\n");
-      return 0;
-      //return TREEVIEW_GetImageList (wndPtr, wParam, lParam);
-
-	case TVM_SETIMAGELIST:
-	    return TREEVIEW_SetImageList (wndPtr, wParam, lParam);
-
-    case TVM_GETNEXTITEM:
-      FIXME (treeview, "Unimplemented msg TVM_GETNEXTITEM\n");
-      return 0;
-
-    case TVM_SELECTITEM:
-      FIXME (treeview, "Unimplemented msg TVM_SELECTITEM \n");
-      return 0;
-
-    case TVM_GETITEMA:
-      FIXME (treeview, "Unimplemented msg TVM_GETITEMA\n");
-      return 0;
-
-    case TVM_GETITEMW:
-      FIXME (treeview, "Unimplemented msg TVM_GETITEMW\n");
-      return 0;
-
-    case TVM_SETITEMA:
-      FIXME (treeview, "Unimplemented msg TVM_SETITEMA\n");
-      return 0;
-
-    case TVM_SETITEMW:
-      FIXME (treeview, "Unimplemented msg TVM_SETITEMW\n");
-      return 0;
-
-    case TVM_EDITLABELA:
-      FIXME (treeview, "Unimplemented msg TVM_EDITLABELA \n");
-      return 0;
-
-    case TVM_EDITLABELW:
-      FIXME (treeview, "Unimplemented msg TVM_EDITLABELW \n");
-      return 0;
-
-    case TVM_GETEDITCONTROL:
-      FIXME (treeview, "Unimplemented msg TVM_GETEDITCONTROL\n");
-      return 0;
-
-    case TVM_GETVISIBLECOUNT:
-      FIXME (treeview, "Unimplemented msg TVM_GETVISIBLECOUNT\n");
-      return 0;
-
-    case TVM_HITTEST:
-      FIXME (treeview, "Unimplemented msg TVM_HITTEST\n");
-      return 0;
-
-    case TVM_CREATEDRAGIMAGE:
-      FIXME (treeview, "Unimplemented msg TVM_CREATEDRAGIMAGE\n");
-      return 0;
-
-    case TVM_SORTCHILDREN:
-      FIXME (treeview, "Unimplemented msg TVM_SORTCHILDREN\n");
-      return 0;
-
-    case TVM_ENSUREVISIBLE:
-      FIXME (treeview, "Unimplemented msg TVM_ENSUREVISIBLE\n");
-      return 0;
-
-    case TVM_SORTCHILDRENCB:
-      FIXME (treeview, "Unimplemented msg TVM_SORTCHILDRENCB\n");
-      return 0;
-
-    case TVM_ENDEDITLABELNOW:
-      FIXME (treeview, "Unimplemented msg TVM_ENDEDITLABELNOW\n");
-      return 0;
-
-    case TVM_GETISEARCHSTRINGA:
-      FIXME (treeview, "Unimplemented msg TVM_GETISEARCHSTRINGA\n");
-      return 0;
-
-    case TVM_GETISEARCHSTRINGW:
-      FIXME (treeview, "Unimplemented msg TVM_GETISEARCHSTRINGW\n");
-      return 0;
-
-    case TVM_SETTOOLTIPS:
-      FIXME (treeview, "Unimplemented msg TVM_SETTOOLTIPS\n");
-      return 0;
-
-    case TVM_GETTOOLTIPS:
-      FIXME (treeview, "Unimplemented msg TVM_GETTOOLTIPS\n");
-      return 0;
-
-	case WM_CREATE:
-	    return TREEVIEW_Create (wndPtr, wParam, lParam);
-
-	case WM_DESTROY:
-	    return TREEVIEW_Destroy (wndPtr, wParam, lParam);
-
-//	case EM_ENABLE:
-
-	case WM_ERASEBKGND:
-	    return TREEVIEW_EraseBackground (wndPtr, wParam, lParam);
-
-	case WM_GETDLGCODE:
-	    return DLGC_WANTARROWS | DLGC_WANTCHARS;
-
-//	case WM_PAINT:
-//	    return TREEVIEW_Paint (wndPtr, wParam);
-
-//	case WM_SETFONT:
-
-//	case WM_TIMER:
-
-//	case WM_VSCROLL:
-
-	default:
-	    if (uMsg >= WM_USER)
-	FIXME (treeview, "Unknown msg %04x wp=%08x lp=%08lx\n",
-		     uMsg, wParam, lParam);
-	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
-    }
-    return 0;
-}
-
-
-void
-TREEVIEW_Register (void)
-{
-    WNDCLASS32A wndClass;
-
-    TRACE (treeview,"\n");
-
-    if (GlobalFindAtom32A (WC_TREEVIEW32A)) return;
-
-    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
-    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS;
-    wndClass.lpfnWndProc   = (WNDPROC32)TREEVIEW_WindowProc;
-    wndClass.cbClsExtra    = 0;
-    wndClass.cbWndExtra    = sizeof(TREEVIEW_INFO *);
-    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
-    wndClass.hbrBackground = 0;
-    wndClass.lpszClassName = WC_TREEVIEW32A;
- 
-    RegisterClass32A (&wndClass);
-}
-
diff --git a/controls/updown.c b/controls/updown.c
deleted file mode 100644
index e93b5ef..0000000
--- a/controls/updown.c
+++ /dev/null
@@ -1,849 +0,0 @@
-/*		
- * Updown control
- *
- * Copyright 1997 Dimitrie O. Paun
- *
- * TODO:
- *   - subclass the buddy window (in UPDOWN_SetBuddy) to process the
- *     arrow keys
- *   - I am not sure about the default values for the Min, Max, Pos
- *     (in the UPDOWN_INFO the fields: MinVal, MaxVal, CurVal)
- *   - I think I do not handle correctly the WS_BORDER style.
- *     (Should be fixed. <ekohl@abo.rhein-zeitung.de>)
- *
- * Testing:
- *   Not much. The following  have not been tested at all:
- *     - horizontal arrows
- *     - listbox as buddy window
- *     - acceleration
- *     - base 16
- *     - UDS_ALIGNLEFT, ~UDS_WRAP
- *     - integers with thousand separators.
- *   Even though the above list seems rather large, the control seems to
- *   behave very well so I am confident it does work in most (all) of the
- *   untested cases.
- * Problems:
- *   I do not like the arrows yet, I'll work more on them later on.
- */
-
-#include <stdlib.h>
-#include <assert.h>
-#include <string.h>
-#include "windows.h"
-#include "winnls.h"
-#include "sysmetrics.h"
-#include "updown.h"
-#include "graphics.h"
-#include "heap.h"
-#include "win.h"
-#include "debug.h"
-
-/* Control configuration constants */
-
-#define INITIAL_DELAY    500 /* initial timer until auto-increment kicks in */
-#define REPEAT_DELAY     50  /* delay between auto-increments */
-
-#define DEFAULT_WIDTH    14  /* default width of the ctrl */
-#define DEFAULT_XSEP      0  /* default separation between buddy and crtl */
-#define DEFAULT_ADDTOP    0  /* amount to extend above the buddy window */
-#define DEFAULT_ADDBOT    0  /* amount to extend below the buddy window */
-
-
-/* Work constants */
-
-#define FLAG_INCR        0x01
-#define FLAG_DECR        0x02
-#define FLAG_MOUSEIN     0x04
-#define FLAG_CLICKED     (FLAG_INCR | FLAG_DECR)
-
-#define TIMERID1         1
-#define TIMERID2         2
-
-static int accelIndex = -1;
-
-#define UNKNOWN_PARAM(msg, wParam, lParam) WARN(updown, \
-        "UpDown Ctrl: Unknown parameter(s) for message " #msg     \
-	"(%04x): wp=%04x lp=%08lx\n", msg, wParam, lParam);
-
-#define UPDOWN_GetInfoPtr(wndPtr) ((UPDOWN_INFO *)wndPtr->wExtra[0])
-
-
-/***********************************************************************
- *           UPDOWN_InBounds
- * Tests if a given value 'val' is between the Min&Max limits
- */
-static BOOL32 UPDOWN_InBounds(WND *wndPtr, int val)
-{
-  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
-
-  if(infoPtr->MaxVal > infoPtr->MinVal)
-    return (infoPtr->MinVal <= val) && (val <= infoPtr->MaxVal);
-  else
-    return (infoPtr->MaxVal <= val) && (val <= infoPtr->MinVal);
-}
-
-/***********************************************************************
- *           UPDOWN_OffsetVal
- * Tests if we can change the current value by delta. If so, it changes
- * it and returns TRUE. Else, it leaves it unchanged and returns FALSE.
- */
-static BOOL32 UPDOWN_OffsetVal(WND *wndPtr, int delta)
-{
-  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
-
-  /* check if we can do the modification first */
-  if(!UPDOWN_InBounds(wndPtr, infoPtr->CurVal+delta)){
-    if(wndPtr->dwStyle & UDS_WRAP)
-      delta += (delta < 0 ? -1 : 1) *
-	(infoPtr->MaxVal < infoPtr->MinVal ? -1 : 1) *
-	(infoPtr->MinVal - infoPtr->MaxVal) +
-	(delta < 0 ? 1 : -1);
-    else
-      return FALSE;
-  }
-
-  infoPtr->CurVal += delta;
-  return TRUE;
-}
-
-/***********************************************************************
- *           UPDOWN_GetArrowRect
- * wndPtr   - pointer to the up-down wnd
- * rect     - will hold the rectangle
- * incr     - TRUE  get the "increment" rect (up or right)
- *            FALSE get the "decrement" rect (down or left)
- *          
- */
-static void UPDOWN_GetArrowRect(WND *wndPtr, RECT32 *rect, BOOL32 incr)
-{
-  int len; /* will hold the width or height */
-
-  GetClientRect32(wndPtr->hwndSelf, rect);
-
-  if (wndPtr->dwStyle & UDS_HORZ) {
-    len = rect->right - rect->left; /* compute the width */
-    if (incr)
-      rect->left = len/2+1; 
-    else
-      rect->right = len/2;
-  }
-  else {
-    len = rect->bottom - rect->top; /* compute the height */
-    if (incr)
-      rect->bottom = len/2;
-    else
-      rect->top = len/2+1;
-  }
-}
-
-/***********************************************************************
- *           UPDOWN_GetArrowFromPoint
- * Returns the rectagle (for the up or down arrow) that contains pt.
- * If it returns the up rect, it returns TRUE.
- * If it returns the down rect, it returns FALSE.
- */
-static int UPDOWN_GetArrowFromPoint(WND *wndPtr, RECT32 *rect, POINT32 pt)
-{
-  UPDOWN_GetArrowRect(wndPtr, rect, TRUE);
-  if(PtInRect32(rect, pt))
-    return TRUE;
-
-  UPDOWN_GetArrowRect(wndPtr, rect, FALSE);
-  return FALSE;
-}
-
-
-/***********************************************************************
- *           UPDOWN_GetThousandSep
- * Returns the thousand sep. If an error occurs, it returns ','.
- */
-static char UPDOWN_GetThousandSep()
-{
-  char sep[2];
-
-  if(GetLocaleInfo32A(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, 
-		      sep, sizeof(sep)) != 1)
-    return ',';
-
-  return sep[0];
-}
-
-/***********************************************************************
- *           UPDOWN_GetBuddyInt
- * Tries to read the pos from the buddy window and if it succeeds,
- * it stores it in the control's CurVal
- * returns:
- *   TRUE  - if it read the integer from the buddy successfully
- *   FALSE - if an error occured
- */
-static BOOL32 UPDOWN_GetBuddyInt(WND *wndPtr)
-{
-  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
-  char txt[20], sep, *src, *dst;
-  int newVal;
-
-  if (!IsWindow32(infoPtr->Buddy))
-    return FALSE;
-
-  /*if the buddy is a list window, we must set curr index */
-  if(WIDGETS_IsControl32(WIN_FindWndPtr(infoPtr->Buddy), BIC32_LISTBOX)){
-    newVal = SendMessage32A(infoPtr->Buddy, LB_GETCARETINDEX32, 0, 0);
-    if(newVal < 0)
-      return FALSE;
-  }
-  else{
-    /* we have a regular window, so will get the text */
-    if (!GetWindowText32A(infoPtr->Buddy, txt, sizeof(txt)))
-      return FALSE;
-
-    sep = UPDOWN_GetThousandSep(); 
-
-    /* now get rid of the separators */
-    for(src = dst = txt; *src; src++)
-      if(*src != sep)
-	*dst++ = *src;
-    *dst = 0;
-
-    /* try to convert the number and validate it */
-    newVal = strtol(txt, &src, infoPtr->Base);
-    if(*src || !UPDOWN_InBounds(wndPtr, newVal)) 
-      return FALSE;
-
-    TRACE(updown, "new value(%d) read from buddy (old=%d)\n", 
-		 newVal, infoPtr->CurVal);
-  }
-  
-  infoPtr->CurVal = newVal;
-  return TRUE;
-}
-
-
-/***********************************************************************
- *           UPDOWN_SetBuddyInt
- * Tries to set the pos to the buddy window based on current pos
- * returns:
- *   TRUE  - if it set the caption of the  buddy successfully
- *   FALSE - if an error occured
- */
-static BOOL32 UPDOWN_SetBuddyInt(WND *wndPtr)
-{
-  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
-  char txt1[20], sep;
-  int len;
-
-  if (!IsWindow32(infoPtr->Buddy)) 
-    return FALSE;
-
-  TRACE(updown, "set new value(%d) to buddy.\n",
-	       infoPtr->CurVal);
-
-  /*if the buddy is a list window, we must set curr index */
-  if(WIDGETS_IsControl32(WIN_FindWndPtr(infoPtr->Buddy), BIC32_LISTBOX)){
-    SendMessage32A(infoPtr->Buddy, LB_SETCURSEL32, infoPtr->CurVal, 0);
-  }
-  else{ /* Regular window, so set caption to the number */
-    len = sprintf(txt1, (infoPtr->Base==16) ? "%X" : "%d", infoPtr->CurVal);
-
-    sep = UPDOWN_GetThousandSep(); 
-
-    if (!(wndPtr->dwStyle & UDS_NOTHOUSANDS)) {
-      char txt2[20], *src = txt1, *dst = txt2;
-      if(len%3 > 0){
-	strncpy(dst, src, len%3);
-	dst += len%3;
-	src += len%3;
-      }
-      for(len=0; *src; len++,src++){
-	if(len%3==0)
-	  *dst++ = sep;
-	*dst++ = *src++;
-      }
-      *dst = 0;           /* null terminate it */
-      strcpy(txt1, txt2); /* move it to the proper place */
-    }
-    SetWindowText32A(infoPtr->Buddy, txt1);
-  }
-
-  return TRUE;
-} 
-
-/***********************************************************************
- * UPDOWN_Draw [Internal]
- *
- * Draw the arrows. The background need not be erased.
- */
-static void UPDOWN_Draw (WND *wndPtr, HDC32 hdc)
-{
-  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
-  BOOL32 prssed;
-  RECT32 rect;
-  
-  /* Draw the incr button */
-  UPDOWN_GetArrowRect(wndPtr, &rect, TRUE);
-  prssed = (infoPtr->Flags & FLAG_INCR) && (infoPtr->Flags & FLAG_MOUSEIN);
-  DrawFrameControl32(hdc, &rect, DFC_SCROLL, 
-	(wndPtr->dwStyle & UDS_HORZ ? DFCS_SCROLLLEFT : DFCS_SCROLLUP) |
-	(prssed ? DFCS_PUSHED : 0) |
-	(wndPtr->dwStyle&WS_DISABLED ? DFCS_INACTIVE : 0) );
-
-  /* Draw the space between the buttons */
-  rect.top = rect.bottom; rect.bottom++;
-  DrawEdge32(hdc, &rect, 0, BF_MIDDLE);
-		    
-  /* Draw the decr button */
-  UPDOWN_GetArrowRect(wndPtr, &rect, FALSE);
-  prssed = (infoPtr->Flags & FLAG_DECR) && (infoPtr->Flags & FLAG_MOUSEIN);
-  DrawFrameControl32(hdc, &rect, DFC_SCROLL, 
-	(wndPtr->dwStyle & UDS_HORZ ? DFCS_SCROLLRIGHT : DFCS_SCROLLDOWN) |
-	(prssed ? DFCS_PUSHED : 0) |
-	(wndPtr->dwStyle&WS_DISABLED ? DFCS_INACTIVE : 0) );
-}
-
-/***********************************************************************
- * UPDOWN_Refresh [Internal]
- *
- * Synchronous drawing (must NOT be used in WM_PAINT).
- * Calls UPDOWN_Draw.
- */
-static void UPDOWN_Refresh (WND *wndPtr)
-{
-    HDC32 hdc;
-  
-    hdc = GetDC32 (wndPtr->hwndSelf);
-    UPDOWN_Draw (wndPtr, hdc);
-    ReleaseDC32 (wndPtr->hwndSelf, hdc);
-}
-
-
-/***********************************************************************
- * UPDOWN_Paint [Internal]
- *
- * Asynchronous drawing (must ONLY be used in WM_PAINT).
- * Calls UPDOWN_Draw.
- */
-static void UPDOWN_Paint (WND *wndPtr)
-{
-    PAINTSTRUCT32 ps;
-    HDC32 hdc;
-  
-    hdc = BeginPaint32 (wndPtr->hwndSelf, &ps);
-    UPDOWN_Draw (wndPtr, hdc);
-    EndPaint32 (wndPtr->hwndSelf, &ps);
-}
-
-/***********************************************************************
- *           UPDOWN_SetBuddy
- * Tests if 'hwndBud' is a valid window handle. If not, returns FALSE.
- * Else, sets it as a new Buddy.
- * Then, it should subclass the buddy 
- * If window has the UDS_ARROWKEYS, it subcalsses the buddy window to
- * process the UP/DOWN arrow keys.
- * If window has the UDS_ALIGNLEFT or UDS_ALIGNRIGHT style
- * the size/pos of the buddy and the control are adjusted accordingly.
- */
-static BOOL32 UPDOWN_SetBuddy(WND *wndPtr, HWND32 hwndBud)
-{
-  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr); 
-  RECT32 budRect; /* new coord for the buddy */
-  int x;          /* new x position and width for the up-down */
- 	  
-  /* Is is a valid bud? */
-  if(!IsWindow32(hwndBud))
-    return FALSE;
-
-  if(wndPtr->dwStyle & UDS_ARROWKEYS){
-    FIXME(updown, "we need to subclass the buddy to process the arrow keys.\n");
-  }
-
-  /* do we need to do any adjustments? */
-  if(!(wndPtr->dwStyle & (UDS_ALIGNLEFT | UDS_ALIGNRIGHT)))
-    return TRUE;
-
-  /* Get the rect of the buddy relative to its parent */
-  GetWindowRect32(infoPtr->Buddy, &budRect);
-  MapWindowPoints32(HWND_DESKTOP, GetParent32(infoPtr->Buddy),
-		  (POINT32 *)(&budRect.left), 2);
-	  
-  /* now do the positioning */
-  if(wndPtr->dwStyle & UDS_ALIGNRIGHT){
-    budRect.right -= DEFAULT_WIDTH+DEFAULT_XSEP;
-    x  = budRect.right+DEFAULT_XSEP;
-  }
-  else{ /* UDS_ALIGNLEFT */
-    x  = budRect.left;
-    budRect.left += DEFAULT_WIDTH+DEFAULT_XSEP;
-  }
-
-  /* first adjust the buddy to accomodate the up/down */
-  SetWindowPos32(infoPtr->Buddy, 0, budRect.left, budRect.top,
-	       budRect.right  - budRect.left, budRect.bottom - budRect.top, 
-	       SWP_NOACTIVATE|SWP_NOZORDER);
-
-  /* now position the up/down */
-  /* Since the UDS_ALIGN* flags were used, */
-  /* we will pick the position and size of the window. */
-
-  SetWindowPos32(wndPtr->hwndSelf,0,x,budRect.top-DEFAULT_ADDTOP,DEFAULT_WIDTH,
-		 (budRect.bottom-budRect.top)+DEFAULT_ADDTOP+DEFAULT_ADDBOT,
-		 SWP_NOACTIVATE|SWP_NOZORDER);
-
-  return TRUE;
-}	  
-
-/***********************************************************************
- *           UPDOWN_DoAction
- *
- * This function increments/decrements the CurVal by the 
- * 'delta' amount according to the 'incr' flag
- * It notifies the parent as required.
- * It handles wraping and non-wraping correctly.
- * It is assumed that delta>0
- */
-static void UPDOWN_DoAction(WND *wndPtr, int delta, BOOL32 incr)
-{
-  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr); 
-  int old_val = infoPtr->CurVal;
-  NM_UPDOWN ni;
-
-  TRACE(updown, "%s by %d\n", incr ? "inc" : "dec", delta);
-
-  /* check if we can do the modification first */
-  delta *= (incr ? 1 : -1) * (infoPtr->MaxVal < infoPtr->MinVal ? -1 : 1);
-  if(!UPDOWN_OffsetVal(wndPtr, delta))
-    return;
-
-  /* so, if we can do the change, recompute delta and restore old value */
-  delta = infoPtr->CurVal - old_val;
-  infoPtr->CurVal = old_val;
-
-  /* We must notify parent now to obtain permission */
-  ni.iPos = infoPtr->CurVal;
-  ni.iDelta = delta;
-  ni.hdr.hwndFrom = wndPtr->hwndSelf;
-  ni.hdr.idFrom = wndPtr->wIDmenu;
-  ni.hdr.code = UDN_DELTAPOS; 
-  if(SendMessage32A(wndPtr->parent->hwndSelf, 
-		    WM_NOTIFY, wndPtr->wIDmenu, (LPARAM)&ni))
-    return; /* we are not allowed to change */
-  
-  /* Now adjust value with (maybe new) delta */
-  if(!UPDOWN_OffsetVal(wndPtr, ni.iDelta))
-    return;
-
-  /* Now take care about our buddy */
-  if(!IsWindow32(infoPtr->Buddy)) 
-    return; /* Nothing else to do */
-
-
-  if(wndPtr->dwStyle & UDS_SETBUDDYINT)
-    UPDOWN_SetBuddyInt(wndPtr);
-
-  /* Also, notify it */
-  /* FIXME: do we need to send the notification only if
-            we do not have the UDS_SETBUDDYINT style set? */
-
-  SendMessage32A(GetParent32 (wndPtr->hwndSelf), 
-		 wndPtr->dwStyle & UDS_HORZ ? WM_HSCROLL : WM_VSCROLL, 
-		 MAKELONG(incr ? SB_LINEUP : SB_LINEDOWN, infoPtr->CurVal),
-		 wndPtr->hwndSelf);
-}
-
-/***********************************************************************
- *           UPDOWN_IsEnabled
- *
- * Returns TRUE if it is enabled as well as its buddy (if any)
- *         FALSE otherwise
- */
-static BOOL32 UPDOWN_IsEnabled(WND *wndPtr)
-{
-  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
-
-  if(wndPtr->dwStyle & WS_DISABLED)
-    return FALSE;
-  return IsWindowEnabled32(infoPtr->Buddy);
-}
-
-/***********************************************************************
- *           UPDOWN_CancelMode
- *
- * Deletes any timers, releases the mouse and does  redraw if necessary.
- * If the control is not in "capture" mode, it does nothing.
- * If the control was not in cancel mode, it returns FALSE. 
- * If the control was in cancel mode, it returns TRUE.
- */
-static BOOL32 UPDOWN_CancelMode(WND *wndPtr)
-{
-  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
- 
-  /* if not in 'capture' mode, do nothing */
-  if(!(infoPtr->Flags & FLAG_CLICKED))
-    return FALSE;
-
-  KillTimer32(wndPtr->hwndSelf, TIMERID1); /* kill all possible timers */
-  KillTimer32(wndPtr->hwndSelf, TIMERID2);
-  
-  if(GetCapture32() == wndPtr->hwndSelf)   /* let the mouse go         */
-    ReleaseCapture();          /* if we still have it      */  
-  
-  infoPtr->Flags = 0;          /* get rid of any flags     */
-  UPDOWN_Refresh (wndPtr);     /* redraw the control just in case */
-  
-  return TRUE;
-}
-
-/***********************************************************************
- *           UPDOWN_HandleMouseEvent
- *
- * Handle a mouse event for the updown.
- * 'pt' is the location of the mouse event in client or
- * windows coordinates. 
- */
-static void UPDOWN_HandleMouseEvent(WND *wndPtr, UINT32 msg, POINT32 pt)
-{
-  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
-  RECT32 rect;
-  int temp;
-
-  switch(msg)
-    {
-    case WM_LBUTTONDOWN:  /* Initialise mouse tracking */
-      /* If we are already in the 'clicked' mode, then nothing to do */
-      if(infoPtr->Flags & FLAG_CLICKED)
-	return;
-
-      /* If the buddy is an edit, will set focus to it */
-      if(WIDGETS_IsControl32(WIN_FindWndPtr(infoPtr->Buddy), BIC32_EDIT))
-	SetFocus32(infoPtr->Buddy);
-
-      /* Now see which one is the 'active' arrow */
-      temp = UPDOWN_GetArrowFromPoint(wndPtr, &rect, pt);
-
-      /* Update the CurVal if necessary */
-      if(wndPtr->dwStyle & UDS_SETBUDDYINT)
-	UPDOWN_GetBuddyInt(wndPtr);
-	
-      /* Before we proceed, see if we can spin... */
-      if(!(wndPtr->dwStyle & UDS_WRAP))
-	if(( temp && infoPtr->CurVal==infoPtr->MaxVal) ||
-	   (!temp && infoPtr->CurVal==infoPtr->MinVal))
-	  return;
-
-      /* Set up the correct flags */
-      infoPtr->Flags  = 0; 
-      infoPtr->Flags |= temp ? FLAG_INCR : FLAG_DECR;
-      infoPtr->Flags |= FLAG_MOUSEIN;
-      
-      /* repaint the control */
-      UPDOWN_Refresh (wndPtr);
-
-      /* process the click */
-      UPDOWN_DoAction(wndPtr, 1, infoPtr->Flags & FLAG_INCR);
-
-      /* now capture all mouse messages */
-      SetCapture32(wndPtr->hwndSelf);
-
-      /* and startup the first timer */
-      SetTimer32(wndPtr->hwndSelf, TIMERID1, INITIAL_DELAY, 0); 
-      break;
-
-    case WM_MOUSEMOVE:
-      /* If we are not in the 'clicked' mode, then nothing to do */
-      if(!(infoPtr->Flags & FLAG_CLICKED))
-	return;
-
-      /* save the flags to see if any got modified */
-      temp = infoPtr->Flags;
-
-      /* Now get the 'active' arrow rectangle */
-      if (infoPtr->Flags & FLAG_INCR)
-	UPDOWN_GetArrowRect(wndPtr, &rect, TRUE);
-      else
-	UPDOWN_GetArrowRect(wndPtr, &rect, FALSE);
-
-      /* Update the flags if we are in/out */
-      if(PtInRect32(&rect, pt))
-	infoPtr->Flags |=  FLAG_MOUSEIN;
-      else{
-	infoPtr->Flags &= ~FLAG_MOUSEIN;
-	if(accelIndex != -1) /* if we have accel info */
-	  accelIndex = 0;    /* reset it              */
-      }
-      /* If state changed, redraw the control */
-      if(temp != infoPtr->Flags)
-	UPDOWN_Refresh (wndPtr);
-      break;
-
-      default:
-	ERR(updown, "Impossible case!\n");
-    }
-
-}
-
-/***********************************************************************
- *           UpDownWndProc
- */
-LRESULT WINAPI UpDownWindowProc(HWND32 hwnd, UINT32 message, WPARAM32 wParam,
-				LPARAM lParam)
-{
-  WND *wndPtr = WIN_FindWndPtr(hwnd);
-  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr); 
-  int temp;
-
-  switch(message)
-    {
-    case WM_NCCREATE:
-      /* get rid of border, if any */
-      wndPtr->dwStyle &= ~WS_BORDER;
-      return TRUE;
-
-    case WM_CREATE:
-      infoPtr =
-	(UPDOWN_INFO*)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-				 sizeof(UPDOWN_INFO));
-      wndPtr->wExtra[0] = (DWORD)infoPtr;
-
-      /* initialize the info struct */
-      infoPtr->AccelCount=0; infoPtr->AccelVect=0; 
-      infoPtr->CurVal=0; infoPtr->MinVal=0; infoPtr->MaxVal=100; /*FIXME*/
-      infoPtr->Base  = 10; /* Default to base 10  */
-      infoPtr->Buddy = 0;  /* No buddy window yet */
-      infoPtr->Flags = 0;  /* And no flags        */
-
-      /* Do we pick the buddy win ourselves? */
-      if(wndPtr->dwStyle & UDS_AUTOBUDDY)
-	UPDOWN_SetBuddy(wndPtr, GetWindow32(wndPtr->hwndSelf, GW_HWNDPREV));
-	
-      TRACE(updown, "UpDown Ctrl creation, hwnd=%04x\n", hwnd);
-      break;
-    
-    case WM_DESTROY:
-      if(infoPtr->AccelVect)
-	free(infoPtr->AccelVect);
-
-      HeapFree (GetProcessHeap (), 0, infoPtr);
-      wndPtr->wExtra[0] = 0;
-
-      TRACE(updown, "UpDown Ctrl destruction, hwnd=%04x\n", hwnd);
-      break;
-	
-    case WM_ENABLE:
-      if(wndPtr->dwStyle & WS_DISABLED)
-	UPDOWN_CancelMode(wndPtr);
-      UPDOWN_Paint(wndPtr);
-      break;
-
-    case WM_TIMER:
-      /* if initial timer, kill it and start the repeat timer */
-      if(wParam == TIMERID1){
-	KillTimer32(hwnd, TIMERID1);
-	/* if no accel info given, used default timer */
-	if(infoPtr->AccelCount==0 || infoPtr->AccelVect==0){
-	  accelIndex = -1;
-	  temp = REPEAT_DELAY;
-	}
-	else{
-	  accelIndex = 0; /* otherwise, use it */
-	  temp = infoPtr->AccelVect[accelIndex].nSec * 1000 + 1;
-	}
-	SetTimer32(hwnd, TIMERID2, temp, 0);
-      }
-
-      /* now, if the mouse is above us, do the thing...*/
-      if(infoPtr->Flags & FLAG_MOUSEIN){
-	temp = accelIndex==-1 ? 1 : infoPtr->AccelVect[accelIndex].nInc;
-	UPDOWN_DoAction(wndPtr, temp, infoPtr->Flags & FLAG_INCR);
-	
-	if(accelIndex!=-1 && accelIndex < infoPtr->AccelCount-1){
-	  KillTimer32(hwnd, TIMERID2);
-	  accelIndex++; /* move to the next accel info */
-	  temp = infoPtr->AccelVect[accelIndex].nSec * 1000 + 1;
-	  /* make sure we have at least 1ms intervals */
-	  SetTimer32(hwnd, TIMERID2, temp, 0);	    
-	}
-      }
-      break;
-
-    case WM_CANCELMODE:
-      UPDOWN_CancelMode(wndPtr);
-      break;
-
-    case WM_LBUTTONUP:
-      if(!UPDOWN_CancelMode(wndPtr))
-	break;
-      /*If we released the mouse and our buddy is an edit */
-      /* we must select all text in it.                   */
-      if(WIDGETS_IsControl32(WIN_FindWndPtr(infoPtr->Buddy), BIC32_EDIT))
-	SendMessage32A(infoPtr->Buddy, EM_SETSEL32, 0, MAKELONG(0, -1));
-      break;
-      
-    case WM_LBUTTONDOWN:
-    case WM_MOUSEMOVE:
-      if(UPDOWN_IsEnabled(wndPtr)){
-	POINT32 pt;
-	CONV_POINT16TO32( (POINT16 *)&lParam, &pt );
-	UPDOWN_HandleMouseEvent( wndPtr, message, pt );
-      }
-    break;
-
-    case WM_KEYDOWN:
-      if((wndPtr->dwStyle & UDS_ARROWKEYS) && UPDOWN_IsEnabled(wndPtr)){
-	switch(wParam){
-	case VK_UP:  
-	case VK_DOWN:
-	  UPDOWN_GetBuddyInt(wndPtr);
-	  UPDOWN_DoAction(wndPtr, 1, wParam==VK_UP);
-	  break;
-	}
-      }
-      break;
-      
-    case WM_PAINT:
-      UPDOWN_Paint(wndPtr);
-      break;
-    
-    case UDM_GETACCEL:
-      if (wParam==0 && lParam==0)    /*if both zero, */
-	return infoPtr->AccelCount;  /*just return the accel count*/
-      if (wParam || lParam){
-	UNKNOWN_PARAM(UDM_GETACCEL, wParam, lParam);
-	return 0;
-      }
-      temp = MIN(infoPtr->AccelCount, wParam);
-      memcpy((void *)lParam, infoPtr->AccelVect, temp*sizeof(UDACCEL));
-      return temp;
-
-    case UDM_SETACCEL:
-      TRACE(updown, "UpDown Ctrl new accel info, hwnd=%04x\n", hwnd);
-      if(infoPtr->AccelVect){
-	free(infoPtr->AccelVect);
-	infoPtr->AccelCount = 0;
-	infoPtr->AccelVect  = 0;
-      }
-      if(wParam==0)
-	return TRUE;
-      infoPtr->AccelVect = malloc(wParam*sizeof(UDACCEL));
-      if(infoPtr->AccelVect==0)
-	return FALSE;
-      memcpy(infoPtr->AccelVect, (void*)lParam, wParam*sizeof(UDACCEL));
-      return TRUE;
-
-    case UDM_GETBASE:
-      if (wParam || lParam)
-	UNKNOWN_PARAM(UDM_GETBASE, wParam, lParam);
-      return infoPtr->Base;
-
-    case UDM_SETBASE:
-      TRACE(updown, "UpDown Ctrl new base(%d), hwnd=%04x\n", 
-		     wParam, hwnd);
-      if ( !(wParam==10 || wParam==16) || lParam)
-	UNKNOWN_PARAM(UDM_SETBASE, wParam, lParam);
-      if (wParam==10 || wParam==16){
-	temp = infoPtr->Base;
-	infoPtr->Base = wParam;
-	return temp;       /* return the prev base */
-      }
-      break;
-
-    case UDM_GETBUDDY:
-      if (wParam || lParam)
-	UNKNOWN_PARAM(UDM_GETBUDDY, wParam, lParam);
-      return infoPtr->Buddy;
-
-    case UDM_SETBUDDY:
-      if (lParam)
-	UNKNOWN_PARAM(UDM_SETBUDDY, wParam, lParam);
-      temp = infoPtr->Buddy;
-      infoPtr->Buddy = wParam;
-      UPDOWN_SetBuddy(wndPtr, wParam);
-      TRACE(updown, "UpDown Ctrl new buddy(%04x), hwnd=%04x\n", 
-		     infoPtr->Buddy, hwnd);
-      return temp;
-
-    case UDM_GETPOS:
-      if (wParam || lParam)
-	UNKNOWN_PARAM(UDM_GETPOS, wParam, lParam);
-      temp = UPDOWN_GetBuddyInt(wndPtr);
-      return MAKELONG(infoPtr->CurVal, temp ? 0 : 1);
-
-    case UDM_SETPOS:
-      if (wParam || HIWORD(lParam))
-	UNKNOWN_PARAM(UDM_GETPOS, wParam, lParam);
-      temp = SLOWORD(lParam);
-      TRACE(updown, "UpDown Ctrl new value(%d), hwnd=%04x\n",
-		     temp, hwnd);
-      if(!UPDOWN_InBounds(wndPtr, temp)){
-	if(temp < infoPtr->MinVal)  
-	  temp = infoPtr->MinVal;
-	if(temp > infoPtr->MaxVal)
-	  temp = infoPtr->MaxVal;
-      }
-      wParam = infoPtr->CurVal; /* save prev value   */
-      infoPtr->CurVal = temp;   /* set the new value */
-      if(wndPtr->dwStyle & UDS_SETBUDDYINT)
-	UPDOWN_SetBuddyInt(wndPtr);
-      return wParam;            /* return prev value */
-      
-    case UDM_GETRANGE:
-      if (wParam || lParam)
-	UNKNOWN_PARAM(UDM_GETRANGE, wParam, lParam);
-      return MAKELONG(infoPtr->MaxVal, infoPtr->MinVal);
-
-    case UDM_SETRANGE:
-      if (wParam)
-	UNKNOWN_PARAM(UDM_SETRANGE, wParam, lParam); /* we must have:     */
-      infoPtr->MaxVal = SLOWORD(lParam); /* UD_MINVAL <= Max <= UD_MAXVAL */
-      infoPtr->MinVal = SHIWORD(lParam); /* UD_MINVAL <= Min <= UD_MAXVAL */
-                                         /* |Max-Min| <= UD_MAXVAL        */
-      TRACE(updown, "UpDown Ctrl new range(%d to %d), hwnd=%04x\n", 
-		     infoPtr->MinVal, infoPtr->MaxVal, hwnd);
-      break;                             
-
-    case UDM_GETRANGE32:
-      if (wParam)
-	*(LPINT32)wParam = infoPtr->MinVal;
-      if (lParam)
-	*(LPINT32)lParam = infoPtr->MaxVal;
-      break;
-
-    case UDM_SETRANGE32:
-      infoPtr->MinVal = (INT32)wParam;
-      infoPtr->MaxVal = (INT32)lParam;
-      if (infoPtr->MaxVal <= infoPtr->MinVal)
-	infoPtr->MaxVal = infoPtr->MinVal + 1;
-      TRACE(updown, "UpDown Ctrl new range(%d to %d), hwnd=%04x\n", 
-		     infoPtr->MinVal, infoPtr->MaxVal, hwnd);
-      break;
-
-    default: 
-      if (message >= WM_USER) 
-	WARN(updown, "unknown msg %04x wp=%04x lp=%08lx\n", 
-		     message, wParam, lParam );
-      return DefWindowProc32A( hwnd, message, wParam, lParam ); 
-    } 
-
-    return 0;
-}
-
-/***********************************************************************
- * UPDOWN_Register [Internal]
- *
- * Registers the updown window class.
- */
-void UPDOWN_Register(void)
-{
-    WNDCLASS32A wndClass;
-
-    if( GlobalFindAtom32A( UPDOWN_CLASS32A ) ) return;
-
-    ZeroMemory( &wndClass, sizeof( WNDCLASS32A ) );
-    wndClass.style         = CS_GLOBALCLASS | CS_VREDRAW;
-    wndClass.lpfnWndProc   = (WNDPROC32)UpDownWindowProc;
-    wndClass.cbClsExtra    = 0;
-    wndClass.cbWndExtra    = sizeof(UPDOWN_INFO*);
-    wndClass.hCursor       = LoadCursor32A( 0, IDC_ARROW32A );
-    wndClass.hbrBackground = (HBRUSH32)(COLOR_3DFACE + 1);
-    wndClass.lpszClassName = UPDOWN_CLASS32A;
- 
-    RegisterClass32A( &wndClass );
-}
-
diff --git a/controls/widgets.c b/controls/widgets.c
index 20ca347..51fe1bc 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -7,7 +7,6 @@
 #include <assert.h>
 
 #include "win.h"
-#include "commctrl.h"
 #include "button.h"
 #include "static.h"
 #include "scroll.h"