Commit in reactos/lib/comctl32 on MAIN
animate.c+12-201.6 -> 1.7
comboex.c+3-311.6 -> 1.7
comctl32.h+31.9 -> 1.10
comctl32.spec+3-31.3 -> 1.4
comctl32undoc.c+21.9 -> 1.10
comctl_Cn.rc+1-11.4 -> 1.5
comctl_Cs.rc+1-11.1 -> 1.2
comctl_De.rc+1-11.5 -> 1.6
comctl_En.rc+1-11.4 -> 1.5
comctl_Es.rc+1-11.4 -> 1.5
comctl_Fr.rc+1-11.4 -> 1.5
comctl_It.rc+1-11.4 -> 1.5
comctl_Ja.rc+1-11.3 -> 1.4
comctl_Ko.rc+1-11.4 -> 1.5
comctl_Nl.rc+1-11.4 -> 1.5
comctl_Pl.rc+1-11.4 -> 1.5
comctl_Pt.rc+1-11.4 -> 1.5
comctl_Ru.rc+1-11.4 -> 1.5
comctl_Si.rc+1-11.4 -> 1.5
comctl_Th.rc+1-11.4 -> 1.5
comctl_Uk.rc+1-11.3 -> 1.4
commctrl.c+65-11.17 -> 1.18
hotkey.c+128-721.4 -> 1.5
imagelist.c+58-301.14 -> 1.15
pager.c+215-4301.4 -> 1.5
propsheet.c+65-141.13 -> 1.14
rebar.c+69-1191.12 -> 1.13
string.c+11-11.2 -> 1.3
tab.c+192-3031.10 -> 1.11
toolbar.c+145-1391.19 -> 1.20
tooltips.c+33-281.8 -> 1.9
treeview.c+91-431.10 -> 1.11
updown.c+2-21.5 -> 1.6
winehq2ros.patch+18-151.10 -> 1.11
+1131-1267
34 modified files
Sync to Wine-20041019:
Dmitry Timoshkov <dmitry@codeweavers.com>
- If an animation is already playing do not restart it.
- Remove WM_CLOSE handler, it leads to a memory corruption later on.
- Do not use GlobalFree for a memory returned by LoadResource.
Robert Shearman <rob@codeweavers.com>
- Implement SetPathWordBreakProc and MirrorIcon.
- Implement ImageList_SetColorTable.
- Implement WS_DISABLED style.
- Issue EN_CHANGE notification.
- Make the control look more like native by using the right font and
  spacing.
- Use TextOutW rather than DrawTextW as we don't use any features of
  DrawTextW.
- Fix caret size and position.
- Implement WM_CHAR and WM_SYSCHAR messages.
- Status update.
- Should create HOTKEY_INFO storage in WM_NCCREATE rather than in
  WM_CREATE so that we can also add the WS_EX_CLIENTEDGE style.
- Remove code that draws the client edge; it is already drawn by
  DefWindowProc.
- Document status of control against v6.0 of native version.
- Don't use TrackMouseEvents/WM_MOUSELEAVE API for handling the hot
  button; use plain mouse capture instead like native.
- Return only HTTRANSPARENT/HTCLIENT from WM_NCHITTEST and remove
  associated hacks of WM_SETCURSOR, WM_NCLBUTTONDOWN and
  WM_NCLBUTTONUP.
- Refactor state change code so that state changes don't happen as
  side effects from messages such as WM_NCCALCSIZE, instead only from
  user input messages like WM_MOUSEMOVE.
- Rebar completeness audit.
- TBN_DELETINGBUTTON sends the command ID, not the index.
- Fill in tbButton structure for TBN_DELETINGBUTTON notification.
- Document TBN_QUERY* sending indices.
- Fix some TRACEs
- More A->W conversions missed by previous patch.
- Fix off-by-one error in validating drag-n-drop from available
  buttons list box to actual buttons list box.
- Unicode flag should be based on the notification window.
- Use Unicode window messages.
- Determine whether to do label edit before sending NM_CLICK.
Francois Gouget <fgouget@free.fr>
- Don't define COBJMACROS in objbase.h.
- Update the Wine sources accordingly.
- Assorted spelling fixes.
Filip Navara <xnavara@volny.cz>
- Implement PSM_INDEXTOID, PSM_INDEXTOPAGE and PSM_PAGETOINDEX messages.
- Partially implement the PSH_WIZARDCONTEXTHELP and PSH_NOCONTEXTHELP
  styles.
- Add note about unimplemented TB_SAVERESTORE message.
- Fix obviously wrong condition in an "if" statement.
Dimitrie O. Paun <dpaun@rogers.com>
- We now have ICC_LINK_CLASS.
- Cleanup W->A transition.
Jon Griffiths <jon_p_griffiths@yahoo.com>
- ImageList_Merge should not fail if indices are bad.
- Add tests for this case, a visible test mode and fix DrawIndirect test
under some native comctl32.dll's.
- Items are variable sized, use an accessor to get at them.
- Combine A/W calls together to remove duplication.
- Don't leak text when removing/changing items.
- Turn off hot tracking when we delete the last item.
- Use the 'delete 1 item' logic when deleting all items.
- Draw +/- correctly for large icon sizes.
- Item height/expand button width must be >= than imagelist size.
- Avoid a magic number, add FIXME for incorrect +/- drawing.
Michael Stefaniuc <mstefani@redhat.com>
- native ImageList_Remove dosn't spit out an error message when
  deleting an index out of range so don't do that either
- add 2 ImageList_Remove tests
Aric Stewart <aric@codeweavers.com>
- Check to make sure PropSheetInfo* is not null before dereferencing it
for some windows messages.
Vitaliy Margolen <wine-patch@kievinfo.com>
- Don't loose last band on insert.
Ge van Geldorp <gvg@reactos.com>
- Pass correct uiParam for SPI_GETNONCLIENTMETRICS.

reactos/lib/comctl32
animate.c 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- animate.c	19 Sep 2004 09:50:05 -0000	1.6
+++ animate.c	20 Oct 2004 08:36:54 -0000	1.7
@@ -119,7 +119,7 @@
     mminfo.cchBuffer = SizeofResource(hInst, hrsrc);
     infoPtr->hMMio = mmioOpenA(NULL, &mminfo, MMIO_READ);
     if (!infoPtr->hMMio) {
-	GlobalFree((HGLOBAL)lpAvi);
+	FreeResource(infoPtr->hRes);
 	return FALSE;
     }
 
@@ -414,8 +414,8 @@
 	return FALSE;
 
     if (infoPtr->hThread || infoPtr->uTimer) {
-	FIXME("Already playing ? what should I do ??\n");
-	ANIMATE_DoStop(infoPtr);
+	TRACE("Already playing\n");
+	return TRUE;
     }
 
     infoPtr->nFromFrame = (INT)LOWORD(lParam);
@@ -443,10 +443,8 @@
 
         if(GetWindowLongA(hWnd, GWL_STYLE) & ACS_TRANSPARENT)
         {
-            HDC hDC = GetDC(hWnd);
             infoPtr->hbrushBG = (HBRUSH)SendMessageA(infoPtr->hwndNotify,
                                                      WM_CTLCOLORSTATIC, 0, (LPARAM)hWnd);
-            ReleaseDC(hWnd,hDC);
         }
 
 	TRACE("Using an animation thread\n");
@@ -804,7 +802,7 @@
 
     InitializeCriticalSection(&infoPtr->cs);
 
-    return 0;
+    return TRUE;
 }
 
 
@@ -860,8 +858,10 @@
     case ACM_OPENA:
 	return ANIMATE_OpenA(hWnd, wParam, lParam);
 
-	/*	case ACM_OPEN32W: FIXME!! */
-	/*	    return ANIMATE_Open32W(hWnd, wParam, lParam); */
+    case ACM_OPENW:
+	FIXME("ACM_OPENW: stub!\n");
+	/* return ANIMATE_Open32W(hWnd, wParam, lParam); */
+	return 0;
 
     case ACM_PLAY:
 	return ANIMATE_Play(hWnd, wParam, lParam);
@@ -870,19 +870,16 @@
 	return ANIMATE_Stop(hWnd, wParam, lParam);
 
     case WM_NCCREATE:
-	ANIMATE_Create(hWnd, wParam, lParam);
-	return DefWindowProcA(hWnd, uMsg, wParam, lParam);
+	return ANIMATE_Create(hWnd, wParam, lParam);
 
     case WM_NCHITTEST:
 	return HTTRANSPARENT;
 
     case WM_DESTROY:
-	ANIMATE_Destroy(hWnd, wParam, lParam);
-	return DefWindowProcA(hWnd, uMsg, wParam, lParam);
+	return ANIMATE_Destroy(hWnd, wParam, lParam);
 
     case WM_ERASEBKGND:
-	ANIMATE_EraseBackground(hWnd, wParam, lParam);
-	break;
+	return ANIMATE_EraseBackground(hWnd, wParam, lParam);
 
     /*	case WM_STYLECHANGED: FIXME shall we do something ?? */
 
@@ -896,10 +893,6 @@
         }
 	return ANIMATE_DrawFrame(ANIMATE_GetInfoPtr(hWnd));
 
-    case WM_CLOSE:
-	ANIMATE_Free(ANIMATE_GetInfoPtr(hWnd));
-	return TRUE;
-
     case WM_PAINT:
         {
             ANIMATE_INFO* infoPtr = ANIMATE_GetInfoPtr(hWnd);
@@ -940,8 +933,7 @@
 	break;
 
     case WM_SIZE:
-	ANIMATE_Size(hWnd, wParam, lParam);
-	return DefWindowProcA(hWnd, uMsg, wParam, lParam);
+	return ANIMATE_Size(hWnd, wParam, lParam);
 
     default:
 	if ((uMsg >= WM_USER) && (uMsg < WM_APP))

reactos/lib/comctl32
comboex.c 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- comboex.c	19 Sep 2004 09:50:05 -0000	1.6
+++ comboex.c	20 Oct 2004 08:36:54 -0000	1.7
@@ -130,8 +130,6 @@
 COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 static LRESULT WINAPI
 COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
-static int CALLBACK
-COMBOEX_PathWordBreakProc(LPWSTR lpch, int ichCurrent, int cch, int code);
 static LRESULT COMBOEX_Destroy (COMBOEX_INFO *infoPtr);
 typedef INT (WINAPI *cmp_func_t)(LPCWSTR, LPCWSTR);
 
@@ -674,11 +672,9 @@
 	infoPtr->dwExtStyle = style;
 
     /* see if we need to change the word break proc on the edit */
-    if ((infoPtr->dwExtStyle ^ dwTemp) & CBES_EX_PATHWORDBREAKPROC) {
-	SendMessageW(infoPtr->hwndEdit, EM_SETWORDBREAKPROC, 0,
-		     (infoPtr->dwExtStyle & CBES_EX_PATHWORDBREAKPROC) ?
-		         (LPARAM)COMBOEX_PathWordBreakProc : 0);
-    }
+    if ((infoPtr->dwExtStyle ^ dwTemp) & CBES_EX_PATHWORDBREAKPROC)
+        SetPathWordBreakProc(infoPtr->hwndEdit, 
+            (infoPtr->dwExtStyle & CBES_EX_PATHWORDBREAKPROC) ? TRUE : FALSE);
 
     /* test if the control's appearance has changed */
     mask = CBES_EX_NOEDITIMAGE | CBES_EX_NOEDITIMAGEINDENT;
@@ -1650,30 +1646,6 @@
     return 0;
 }
 
-static inline int is_delimiter(WCHAR c)
-{
-    switch(c) {
-	case '/':
-	case '\\':
-	case '.':
-	    return TRUE;
-    }
-    return FALSE;
-}
-
-static int CALLBACK
-COMBOEX_PathWordBreakProc(LPWSTR lpch, int ichCurrent, int cch, int code)
-{
-    if (code == WB_ISDELIMITER) {
-	return is_delimiter(lpch[ichCurrent]);
-    } else {
-	int dir = (code == WB_LEFT) ? -1 : 1;
-        for(; 0 <= ichCurrent && ichCurrent < cch; ichCurrent += dir)
-	    if (is_delimiter(lpch[ichCurrent])) return ichCurrent;
-    }
-    return ichCurrent;
-}
-
 static LRESULT WINAPI
 COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {

reactos/lib/comctl32
comctl32.h 1.9 -> 1.10
diff -u -r1.9 -r1.10
--- comctl32.h	19 Sep 2004 09:50:06 -0000	1.9
+++ comctl32.h	20 Oct 2004 08:36:54 -0000	1.10
@@ -188,4 +188,7 @@
 
 #define DPA_GetPtrCount(hdpa)  (*(INT*)(hdpa))
 
+LRESULT WINAPI SetPathWordBreakProc(HWND hwnd, BOOL bSet);
+BOOL WINAPI MirrorIcon(HICON *phicon1, HICON *phicon2);
+
 #endif  /* __WINE_COMCTL32_H */

reactos/lib/comctl32
comctl32.spec 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- comctl32.spec	16 Jun 2004 06:46:13 -0000	1.3
+++ comctl32.spec	20 Oct 2004 08:36:54 -0000	1.4
@@ -89,13 +89,13 @@
 377 stdcall -noname IntlStrEqWorkerW(long wstr wstr long)
 382 stdcall -noname SmoothScrollWindow(ptr)
 383 stub -noname DoReaderMode
-384 stub -noname SetPathWordBreakProc
+384 stdcall -noname SetPathWordBreakProc(ptr long)
 385 stdcall -noname DPA_EnumCallback(long long long)
 386 stdcall -noname DPA_DestroyCallback(ptr ptr long)
 387 stdcall -noname DSA_EnumCallback(ptr ptr long)
 388 stdcall -noname DSA_DestroyCallback(ptr ptr long)
 389 stub -noname SHGetProcessDword
-390 stub -noname ImageList_SetColorTable
+390 stdcall -noname ImageList_SetColorTable(ptr long long ptr)
 400 stdcall -noname CreateMRUListW(ptr)
 401 stdcall -noname AddMRUStringW(long wstr)
 402 stdcall -noname FindMRUStringW(long wstr ptr)
@@ -105,7 +105,7 @@
 411 stdcall GetWindowSubclass(long ptr long ptr)
 412 stdcall RemoveWindowSubclass(long ptr long)
 413 stdcall DefSubclassProc(long long long long)
-414 stub -noname MirrorIcon
+414 stdcall -noname MirrorIcon(ptr ptr)
 415 stdcall DrawTextWrap(long wstr long ptr long) user32.DrawTextW
 416 stdcall DrawTextExPrivWrap(long wstr long ptr long ptr) user32.DrawTextExW
 417 stdcall ExtTextOutWrap(long long long long ptr wstr long ptr) gdi32.ExtTextOutW

reactos/lib/comctl32
comctl32undoc.c 1.9 -> 1.10
diff -u -r1.9 -r1.10
--- comctl32undoc.c	19 Sep 2004 09:50:06 -0000	1.9
+++ comctl32undoc.c	20 Oct 2004 08:36:54 -0000	1.10
@@ -34,8 +34,10 @@
 #include <ctype.h>
 #include <limits.h>
 
+#define COBJMACROS
 #define NONAMELESSUNION
 #define NONAMELESSSTRUCT
+
 #include "windef.h"
 #include "winbase.h"
 #include "wingdi.h"

reactos/lib/comctl32
comctl_Cn.rc 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- comctl_Cn.rc	19 Sep 2004 09:50:06 -0000	1.4
+++ comctl_Cn.rc	20 Oct 2004 08:36:54 -0000	1.5
@@ -20,7 +20,7 @@
 #pragma code_page(936)
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "���� "
 FONT 8, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
comctl_Cs.rc 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- comctl_Cs.rc	19 Sep 2004 09:50:06 -0000	1.1
+++ comctl_Cs.rc	20 Oct 2004 08:36:54 -0000	1.2
@@ -22,7 +22,7 @@
 LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "Vlastnosti "
 FONT 8, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
comctl_De.rc 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- comctl_De.rc	19 Sep 2004 09:50:06 -0000	1.5
+++ comctl_De.rc	20 Oct 2004 08:36:54 -0000	1.6
@@ -40,7 +40,7 @@
 }
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "Eigenschaften f�r "
 FONT 8, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
comctl_En.rc 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- comctl_En.rc	19 Sep 2004 09:50:06 -0000	1.4
+++ comctl_En.rc	20 Oct 2004 08:36:54 -0000	1.5
@@ -19,7 +19,7 @@
 LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "Properties for "
 FONT 8, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
comctl_Es.rc 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- comctl_Es.rc	19 Sep 2004 09:50:06 -0000	1.4
+++ comctl_Es.rc	20 Oct 2004 08:36:54 -0000	1.5
@@ -19,7 +19,7 @@
 LANGUAGE LANG_SPANISH, SUBLANG_DEFAULT
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "Propiedades de "
 FONT 8, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
comctl_Fr.rc 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- comctl_Fr.rc	19 Sep 2004 09:50:06 -0000	1.4
+++ comctl_Fr.rc	20 Oct 2004 08:36:54 -0000	1.5
@@ -23,7 +23,7 @@
 LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "Propri�t�s pour "
 FONT 8, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
comctl_It.rc 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- comctl_It.rc	19 Sep 2004 09:50:06 -0000	1.4
+++ comctl_It.rc	20 Oct 2004 08:36:54 -0000	1.5
@@ -20,7 +20,7 @@
 LANGUAGE LANG_ITALIAN, SUBLANG_DEFAULT
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "Propriet� per "
 FONT 8, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
comctl_Ja.rc 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- comctl_Ja.rc	16 Jun 2004 06:46:13 -0000	1.3
+++ comctl_Ja.rc	20 Oct 2004 08:36:54 -0000	1.4
@@ -19,7 +19,7 @@
 LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "Properties for "
 FONT 9, "MS UI Gothic"
 BEGIN

reactos/lib/comctl32
comctl_Ko.rc 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- comctl_Ko.rc	19 Sep 2004 09:50:06 -0000	1.4
+++ comctl_Ko.rc	20 Oct 2004 08:36:54 -0000	1.5
@@ -19,7 +19,7 @@
 LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "Properties for "
 FONT 9, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
comctl_Nl.rc 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- comctl_Nl.rc	19 Sep 2004 09:50:06 -0000	1.4
+++ comctl_Nl.rc	20 Oct 2004 08:36:54 -0000	1.5
@@ -21,7 +21,7 @@
 LANGUAGE LANG_DUTCH, SUBLANG_DEFAULT
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "Eigenschappen van "
 FONT 8, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
comctl_Pl.rc 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- comctl_Pl.rc	19 Sep 2004 09:50:06 -0000	1.4
+++ comctl_Pl.rc	20 Oct 2004 08:36:54 -0000	1.5
@@ -20,7 +20,7 @@
 LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "W�a�ciwo�ci "
 FONT 8, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
comctl_Pt.rc 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- comctl_Pt.rc	19 Sep 2004 09:50:06 -0000	1.4
+++ comctl_Pt.rc	20 Oct 2004 08:36:54 -0000	1.5
@@ -19,7 +19,7 @@
 LANGUAGE LANG_PORTUGUESE, SUBLANG_DEFAULT
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "Propriedades para "
 FONT 8, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
comctl_Ru.rc 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- comctl_Ru.rc	19 Sep 2004 09:50:06 -0000	1.4
+++ comctl_Ru.rc	20 Oct 2004 08:36:54 -0000	1.5
@@ -21,7 +21,7 @@
 LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "�������� ��� "
 FONT 8, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
comctl_Si.rc 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- comctl_Si.rc	19 Sep 2004 09:50:06 -0000	1.4
+++ comctl_Si.rc	20 Oct 2004 08:36:54 -0000	1.5
@@ -19,7 +19,7 @@
 LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "Lastnosti"
 FONT 8, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
comctl_Th.rc 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- comctl_Th.rc	19 Sep 2004 09:50:06 -0000	1.4
+++ comctl_Th.rc	20 Oct 2004 08:36:54 -0000	1.5
@@ -19,7 +19,7 @@
 LANGUAGE LANG_THAI, SUBLANG_DEFAULT
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "������������ "
 FONT 8, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
comctl_Uk.rc 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- comctl_Uk.rc	19 Sep 2004 09:50:06 -0000	1.3
+++ comctl_Uk.rc	20 Oct 2004 08:36:55 -0000	1.4
@@ -21,7 +21,7 @@
 LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
 CAPTION "����������� ��� "
 FONT 8, "MS Shell Dlg"
 BEGIN

reactos/lib/comctl32
commctrl.c 1.17 -> 1.18
diff -u -r1.17 -r1.18
--- commctrl.c	18 Oct 2004 21:31:41 -0000	1.17
+++ commctrl.c	20 Oct 2004 08:36:55 -0000	1.18
@@ -41,7 +41,7 @@
  *   -- ICC_DATE_CLASSES
  *   -- ICC_HOTKEY_CLASS
  *   -- ICC_INTERNET_CLASSES
- *   -- ICC_LINK_CLASS (not yet implemented)
+ *   -- ICC_LINK_CLASS
  *   -- ICC_LISTVIEW_CLASSES
  *   -- ICC_NATIVEFNTCTL_CLASS
  *   -- ICC_PAGESCROLLER_CLASS
@@ -1485,3 +1485,67 @@
     SelectObject(hDC, hOldPen);
     DeleteObject(hPen);
 }
+
+/***********************************************************************
+ * MirrorIcon [COMCTL32.414]
+ *
+ * Mirrors an icon so that it will appear correctly on a mirrored DC.
+ *
+ * PARAMS
+ *     phicon1 [I/O] Icon.
+ *     phicon2 [I/O] Icon.
+ *
+ * RETURNS
+ *     Success: TRUE.
+ *     Failure: FALSE.
+ */
+BOOL WINAPI MirrorIcon(HICON *phicon1, HICON *phicon2)
+{
+    FIXME("(%p, %p): stub\n", phicon1, phicon2);
+    return FALSE;
+}
+
+static inline int IsDelimiter(WCHAR c)
+{
+    switch(c)
+    {
+	case '/':
+	case '\\':
+	case '.':
+	case ' ':
+	    return TRUE;
+    }
+    return FALSE;
+}
+
+static int CALLBACK PathWordBreakProc(LPWSTR lpch, int ichCurrent, int cch, int code)
+{
+    if (code == WB_ISDELIMITER)
+        return IsDelimiter(lpch[ichCurrent]);
+    else
+    {
+        int dir = (code == WB_LEFT) ? -1 : 1;
+        for(; 0 <= ichCurrent && ichCurrent < cch; ichCurrent += dir)
+            if (IsDelimiter(lpch[ichCurrent])) return ichCurrent;
+    }
+    return ichCurrent;
+}
+
+/***********************************************************************
+ * SetPathWordBreakProc [COMCTL32.384]
+ *
+ * Sets the word break procedure for an edit control to one that understands
+ * paths so that the user can jump over directories.
+ *
+ * PARAMS
+ *     hwnd [I] Handle to edit control.
+ *     bSet [I] If this is TRUE then the word break proc is set, otherwise it is removed.
+ *
+ * RETURNS
+ *     Result from EM_SETWORDBREAKPROC message.
+ */
+LRESULT WINAPI SetPathWordBreakProc(HWND hwnd, BOOL bSet)
+{
+    return SendMessageW(hwnd, EM_SETWORDBREAKPROC, 0,
+        (LPARAM)(bSet ? PathWordBreakProc : NULL));
+}

reactos/lib/comctl32
hotkey.c 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- hotkey.c	19 Sep 2004 09:50:06 -0000	1.4
+++ hotkey.c	20 Oct 2004 08:36:55 -0000	1.5
@@ -3,6 +3,7 @@
  *
  * Copyright 1998, 1999 Eric Kohl
  * Copyright 2002 Gyorgy 'Nog' Jeney
+ * Copyright 2004 Robert Shearman
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -18,8 +19,13 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * TODO:
- *   - What are we meant to do with the WM_CHAR message?
+ * This code was audited for completeness against the documented features
+ * of Comctl32.dll version 6.0 on Sep. 21, 2004, by Robert Shearman.
+ * 
+ * Unless otherwise noted, we believe this code to be complete, as per
+ * the specification mentioned above.
+ * If you discover missing features or bugs please note them below.
+ *
  */
 
 #include <stdarg.h>
@@ -54,6 +60,7 @@
 #define HOTKEY_GetInfoPtr(hwnd) ((HOTKEY_INFO *)GetWindowLongPtrA (hwnd, 0))
 
 static const WCHAR HOTKEY_plussep[] = { ' ', '+', ' ' };
+static LRESULT HOTKEY_SetFont (HOTKEY_INFO *infoPtr, WPARAM wParam, LPARAM lParam);
 
 #define IsOnlySet(flags) (infoPtr->CurrMod == (flags))
 
@@ -87,42 +94,55 @@
 #undef IsOnlySet
 
 static void
-HOTKEY_DrawHotKey(HOTKEY_INFO *infoPtr, LPCWSTR KeyName, WORD NameLen, 
-                  LPRECT rc, HDC hdc)
+HOTKEY_DrawHotKey(HOTKEY_INFO *infoPtr, LPCWSTR KeyName, WORD NameLen, HDC hdc)
 {
     SIZE TextSize;
-    DWORD dwExStyle = GetWindowLongW (infoPtr->hwndSelf, GWL_EXSTYLE);
+    INT nXStart, nYStart;
+    COLORREF clrOldText, clrOldBk;
+    HFONT hFontOld;
+
+    /* Make a gap from the frame */
+    nXStart = GetSystemMetrics(SM_CXBORDER);
+    nYStart = GetSystemMetrics(SM_CYBORDER);
+
+    hFontOld = SelectObject(hdc, infoPtr->hFont);
+    if (GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & WS_DISABLED)
+    {
+        clrOldText = SetTextColor(hdc, comctl32_color.clrGrayText);
+        clrOldBk = SetBkColor(hdc, comctl32_color.clrBtnFace);
+    }
+    else
+    {
+        clrOldText = SetTextColor(hdc, comctl32_color.clrWindowText);
+        clrOldBk = SetBkColor(hdc, comctl32_color.clrWindow);
+    }
+
+    TextOutW(hdc, nXStart, nYStart, KeyName, NameLen);
 
-    /* We have to allow some space for the frame to be drawn */
-    rc->left += 2;
-    rc->top++;
-    DrawTextW(hdc, KeyName, NameLen, rc, DT_LEFT | DT_VCENTER);
-    rc->left -= 2;
-    rc->top--;
-    if(dwExStyle & WS_EX_CLIENTEDGE)
-	DrawEdge(hdc, rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
-
-    /* Get the text size and position the caret accordingly */
-    GetTextExtentPoint32W (hdc, KeyName, NameLen, &TextSize);
-    infoPtr->CaretPos = TextSize.cx + 2;
-    SetCaretPos(infoPtr->CaretPos, 3);
+    /* Get the text width for the caret */
+    GetTextExtentPoint32W(hdc, KeyName, NameLen, &TextSize);
+    infoPtr->CaretPos = nXStart + TextSize.cx;
+
+    SetBkColor(hdc, clrOldBk);
+    SetTextColor(hdc, clrOldText);
+    SelectObject(hdc, hFontOld);
+
+    /* position the caret */
+    SetCaretPos(infoPtr->CaretPos, nYStart);
 }
 
 /* Draw the names of the keys in the control */
 static void 
 HOTKEY_Refresh(HOTKEY_INFO *infoPtr, HDC hdc)
 {
-    WCHAR KeyName[sizeof(WCHAR) * 64];
+    WCHAR KeyName[64];
     WORD NameLen = 0;
     BYTE Modifier;
-    RECT rc;
-
-    GetClientRect(infoPtr->hwndSelf, &rc);
 
     TRACE("(infoPtr=%p hdc=%p)\n", infoPtr, hdc);
 
     if(!infoPtr->CurrMod && !infoPtr->HotKey) {
-	HOTKEY_DrawHotKey (infoPtr, infoPtr->strNone, 4, &rc, hdc);
+	HOTKEY_DrawHotKey (infoPtr, infoPtr->strNone, 4, hdc);
 	return;
     }
 	
@@ -162,7 +182,7 @@
     else
 	KeyName[NameLen] = 0;
 
-    HOTKEY_DrawHotKey (infoPtr, KeyName, NameLen, &rc, hdc);
+    HOTKEY_DrawHotKey (infoPtr, KeyName, NameLen, hdc);
 }
 
 static void
@@ -206,31 +226,13 @@
           infoPtr->InvComb, infoPtr->InvMod);
 }
 
-/* << HOTKEY_Char >> */
 
 static LRESULT
-HOTKEY_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
+HOTKEY_Create (HOTKEY_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
 {
-    HOTKEY_INFO *infoPtr;
-    TEXTMETRICW tm;
-    HDC hdc;
-
-    /* allocate memory for info structure */
-    infoPtr = (HOTKEY_INFO *)Alloc (sizeof(HOTKEY_INFO));
-    SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
-
-    /* initialize info structure */
-    infoPtr->HotKey = infoPtr->InvComb = infoPtr->InvMod = infoPtr->CurrMod = 0;
-    infoPtr->CaretPos = 2;
-    infoPtr->hwndSelf = hwnd;
     infoPtr->hwndNotify = ((LPCREATESTRUCTA)lParam)->hwndParent;
-    LoadStringW(COMCTL32_hModule, HKY_NONE, infoPtr->strNone, 15);
 
-    /* get default font height */
-    hdc = GetDC (hwnd);
-    GetTextMetricsW (hdc, &tm);
-    infoPtr->nHeight = tm.tmHeight;
-    ReleaseDC (hwnd, hdc);
+    HOTKEY_SetFont(infoPtr, (WPARAM)GetStockObject(SYSTEM_FONT), 0);
 
     return 0;
 }
@@ -250,18 +252,26 @@
 static LRESULT
 HOTKEY_EraseBackground (HOTKEY_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
 {
-    HBRUSH hBrush;
+    HBRUSH hBrush, hSolidBrush = NULL;
     RECT   rc;
 
-    hBrush =
-	(HBRUSH)SendMessageW (infoPtr->hwndNotify, WM_CTLCOLOREDIT,
-				wParam, (LPARAM)infoPtr->hwndSelf);
-    if (hBrush)
-	hBrush = (HBRUSH)GetStockObject (WHITE_BRUSH);
+    if (GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & WS_DISABLED)
+        hBrush = hSolidBrush = CreateSolidBrush(comctl32_color.clrBtnFace);
+    else
+    {
+        hBrush = (HBRUSH)SendMessageW(infoPtr->hwndNotify, WM_CTLCOLOREDIT,
+            wParam, (LPARAM)infoPtr->hwndSelf);
+        if (!hBrush)
+            hBrush = hSolidBrush = CreateSolidBrush(comctl32_color.clrWindow);
+    }
+
     GetClientRect (infoPtr->hwndSelf, &rc);
 
     FillRect ((HDC)wParam, &rc, hBrush);
 
+    if (hSolidBrush)
+        DeleteObject(hSolidBrush);
+
     return -1;
 }
 
@@ -275,11 +285,22 @@
 static LRESULT
 HOTKEY_KeyDown (HOTKEY_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
 {
+    WORD wOldHotKey;
+    BYTE bOldMod;
+
+    if (GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & WS_DISABLED)
+        return 0;
+
     TRACE("() Key: %d\n", wParam);
+
+    wOldHotKey = infoPtr->HotKey;
+    bOldMod = infoPtr->CurrMod;
+
     /* If any key is Pressed, we have to reset the hotkey in the control */
     infoPtr->HotKey = 0;
 
-    switch (wParam) {
+    switch (wParam)
+    {
 	case VK_RETURN:
 	case VK_TAB:
 	case VK_SPACE:
@@ -309,7 +330,16 @@
 	    break;
     }
 
-    InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
+    if ((wOldHotKey != infoPtr->HotKey) || (bOldMod != infoPtr->CurrMod))
+    {
+        InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
+
+        /* send EN_CHANGE notification */
+        SendMessageW(infoPtr->hwndNotify, WM_COMMAND,
+            MAKEWPARAM(GetDlgCtrlID(infoPtr->hwndSelf), EN_CHANGE),
+            (LPARAM)infoPtr->hwndSelf);
+    }
+
     return 0;
 }
 
@@ -317,8 +347,17 @@
 static LRESULT
 HOTKEY_KeyUp (HOTKEY_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
 {
+    BYTE bOldMod;
+
+    if (GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & WS_DISABLED)
+        return 0;
+
     TRACE("() Key: %d\n", wParam);
-    switch (wParam) {
+
+    bOldMod = infoPtr->CurrMod;
+
+    switch (wParam)
+    {
 	case VK_SHIFT:
 	    infoPtr->CurrMod &= ~HOTKEYF_SHIFT;
 	    break;
@@ -332,7 +371,15 @@
 	    return 1;
     }
 
-    InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
+    if (bOldMod != infoPtr->CurrMod)
+    {
+        InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
+
+        /* send EN_CHANGE notification */
+        SendMessageW(infoPtr->hwndNotify, WM_COMMAND,
+            MAKEWPARAM(GetDlgCtrlID(infoPtr->hwndSelf), EN_CHANGE),
+            (LPARAM)infoPtr->hwndSelf);
+    }
 
     return 0;
 }
@@ -351,18 +398,31 @@
 static LRESULT
 HOTKEY_LButtonDown (HOTKEY_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
 {
-    SetFocus (infoPtr->hwndSelf);
+    if (!(GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & WS_DISABLED))
+        SetFocus (infoPtr->hwndSelf);
 
     return 0;
 }
 
 
 inline static LRESULT
-HOTKEY_NCCreate (HOTKEY_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+HOTKEY_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
-    DWORD dwExStyle = GetWindowLongW (infoPtr->hwndSelf, GWL_EXSTYLE);
-    SetWindowLongW (infoPtr->hwndSelf, GWL_EXSTYLE, 
+    HOTKEY_INFO *infoPtr;
+    DWORD dwExStyle = GetWindowLongW (hwnd, GWL_EXSTYLE);
+    SetWindowLongW (hwnd, GWL_EXSTYLE, 
                     dwExStyle | WS_EX_CLIENTEDGE);
+
+    /* allocate memory for info structure */
+    infoPtr = (HOTKEY_INFO *)Alloc (sizeof(HOTKEY_INFO));
+    SetWindowLongPtrW(hwnd, 0, (DWORD_PTR)infoPtr);
+
+    /* initialize info structure */
+    infoPtr->HotKey = infoPtr->InvComb = infoPtr->InvMod = infoPtr->CurrMod = 0;
+    infoPtr->CaretPos = GetSystemMetrics(SM_CXBORDER);
+    infoPtr->hwndSelf = hwnd;
+    LoadStringW(COMCTL32_hModule, HKY_NONE, infoPtr->strNone, 15);
+
     return DefWindowProcW (infoPtr->hwndSelf, WM_NCCREATE, wParam, lParam);
 }
 
@@ -371,19 +431,15 @@
 {
     infoPtr->bFocus = TRUE;
 
-
-    CreateCaret (infoPtr->hwndSelf, NULL, 1, infoPtr->nHeight - 2);
-
-    SetCaretPos (infoPtr->CaretPos, 3);
-
+    CreateCaret (infoPtr->hwndSelf, NULL, 1, infoPtr->nHeight);
+    SetCaretPos (infoPtr->CaretPos, GetSystemMetrics(SM_CYBORDER));
     ShowCaret (infoPtr->hwndSelf);
 
-
     return 0;
 }
 
 
-inline static LRESULT
+static LRESULT
 HOTKEY_SetFont (HOTKEY_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
 {
     TEXTMETRICW tm;
@@ -414,7 +470,7 @@
 {
     HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
     TRACE("hwnd=%p msg=%x wparam=%x lparam=%lx\n", hwnd, uMsg, wParam, lParam);
-    if (!infoPtr && (uMsg != WM_CREATE))
+    if (!infoPtr && (uMsg != WM_NCCREATE))
         return DefWindowProcW (hwnd, uMsg, wParam, lParam);
     switch (uMsg)
     {
@@ -427,10 +483,12 @@
             HOTKEY_SetRules (infoPtr, wParam, lParam);
 	    break;
 
-/*	case WM_CHAR: */
+	case WM_CHAR:
+	case WM_SYSCHAR:
+	    return HOTKEY_KeyDown (infoPtr, MapVirtualKeyW(LOBYTE(HIWORD(lParam)), 1), lParam);
 
 	case WM_CREATE:
-	    return HOTKEY_Create (hwnd, wParam, lParam);
+	    return HOTKEY_Create (infoPtr, wParam, lParam);
 
 	case WM_DESTROY:
 	    return HOTKEY_Destroy (infoPtr, wParam, lParam);
@@ -459,7 +517,7 @@
 	    return HOTKEY_LButtonDown (infoPtr, wParam, lParam);
 
 	case WM_NCCREATE:
-	    return HOTKEY_NCCreate (infoPtr, wParam, lParam);
+	    return HOTKEY_NCCreate (hwnd, wParam, lParam);
 
 	case WM_PAINT:
 	    HOTKEY_Paint(infoPtr, (HDC)wParam);
@@ -471,8 +529,6 @@
 	case WM_SETFONT:
 	    return HOTKEY_SetFont (infoPtr, wParam, lParam);
 
-/*	case WM_SYSCHAR: */
-
 	default:
 	    if ((uMsg >= WM_USER) && (uMsg < WM_APP))
 		ERR("unknown msg %04x wp=%08x lp=%08lx\n",
@@ -490,7 +546,7 @@
 
     ZeroMemory (&wndClass, sizeof(WNDCLASSW));
     wndClass.style         = CS_GLOBALCLASS;
-    wndClass.lpfnWndProc   = (WNDPROC)HOTKEY_WindowProc;
+    wndClass.lpfnWndProc   = HOTKEY_WindowProc;
     wndClass.cbClsExtra    = 0;
     wndClass.cbWndExtra    = sizeof(HOTKEY_INFO *);
     wndClass.hCursor       = 0;

reactos/lib/comctl32
imagelist.c 1.14 -> 1.15
diff -u -r1.14 -r1.15
--- imagelist.c	19 Sep 2004 09:50:06 -0000	1.14
+++ imagelist.c	20 Oct 2004 08:36:55 -0000	1.15
@@ -39,6 +39,9 @@
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
+
+#define COBJMACROS
+
 #include "winerror.h"
 #include "windef.h"
 #include "winbase.h"
@@ -584,7 +587,7 @@
             goto cleanup;
     }
 
-    /* Default to ILC_COLOR4 if non of the ILC_COLOR* flags are specified */
+    /* Default to ILC_COLOR4 if none of the ILC_COLOR* flags are specified */
     if (ilc == ILC_COLOR)
         ilc = ILC_COLOR4;
 
@@ -1716,8 +1719,7 @@
 /*************************************************************************
  * ImageList_Merge [COMCTL32.@]
  *
- * Creates a new image list that contains a merged image from the specified
- * images of both source image lists.
+ * Create an image list containing a merged image from two image lists.
  *
  * PARAMS
  *     himl1 [I] handle to first image list
@@ -1728,10 +1730,16 @@
  *     dy    [I] Y offset of the second image relative to the first.
  *
  * RETURNS
- *     Success: handle of the merged image list.
- *     Failure: NULL
+ *     Success: The newly created image list. It contains a single image
+ *              consisting of the second image merged with the first.
+ *     Failure: NULL, if either himl1 or himl2 are invalid.
+ *
+ * NOTES
+ *   - The returned image list should be deleted by the caller using
+ *     ImageList_Destroy() when it is no longer required.
+ *   - If either i1 or i2 are not valid image indices they will be treated
+ *     as a blank image.
  */
-
 HIMAGELIST WINAPI
 ImageList_Merge (HIMAGELIST himl1, INT i1, HIMAGELIST himl2, INT i2,
 		 INT dx, INT dy)
@@ -1747,17 +1755,6 @@
     if (!is_valid(himl1) || !is_valid(himl2))
 	return NULL;
 
-    /* check indices */
-    if ((i1 < 0) || (i1 >= himl1->cCurImage)) {
-        ERR("Index 1 out of range! %d\n", i1);
-        return NULL;
-    }
-
-    if ((i2 < 0) || (i2 >= himl2->cCurImage)) {
-        ERR("Index 2 out of range! %d\n", i2);
-        return NULL;
-    }
-
     if (dx > 0) {
         cxDst = max (himl1->cx, dx + himl2->cx);
         xOff1 = 0;
@@ -1791,23 +1788,28 @@
     }
 
     himlDst = ImageList_Create (cxDst, cyDst, ILC_MASK | ILC_COLOR, 1, 1);
-    if (!himlDst)
-        return NULL;
 
-    if (himlDst) {
+    if (himlDst)
+    {
         nX1 = i1 * himl1->cx;
         nX2 = i2 * himl2->cx;
 
         /* copy image */
-        BitBlt (himlDst->hdcImage,     0,     0,     cxDst,     cyDst, himl1->hdcImage,   0, 0, BLACKNESS);
-        BitBlt (himlDst->hdcImage, xOff1, yOff1, himl1->cx, himl1->cy, himl1->hdcImage, nX1, 0, SRCCOPY);
-        BitBlt (himlDst->hdcImage, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcMask , nX2, 0, SRCAND);
-        BitBlt (himlDst->hdcImage, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcImage, nX2, 0, SRCPAINT);
+        BitBlt (himlDst->hdcImage, 0, 0, cxDst, cyDst, himl1->hdcImage, 0, 0, BLACKNESS);
+        if (i1 >= 0 && i1 < himl1->cCurImage)
+            BitBlt (himlDst->hdcImage, xOff1, yOff1, himl1->cx, himl1->cy, himl1->hdcImage, nX1, 0, SRCCOPY);
+        if (i2 >= 0 && i2 < himl2->cCurImage)
+        {
+            BitBlt (himlDst->hdcImage, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcMask , nX2, 0, SRCAND);
+            BitBlt (himlDst->hdcImage, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcImage, nX2, 0, SRCPAINT);
+        }
 
         /* copy mask */
-        BitBlt (himlDst->hdcMask,      0,     0,     cxDst,     cyDst, himl1->hdcMask,    0, 0, WHITENESS);
-        BitBlt (himlDst->hdcMask,  xOff1, yOff1, himl1->cx, himl1->cy, himl1->hdcMask,  nX1, 0, SRCCOPY);
-        BitBlt (himlDst->hdcMask,  xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcMask,  nX2, 0, SRCAND);
+        BitBlt (himlDst->hdcMask, 0, 0, cxDst, cyDst, himl1->hdcMask, 0, 0, WHITENESS);
+        if (i1 >= 0 && i1 < himl1->cCurImage)
+            BitBlt (himlDst->hdcMask,  xOff1, yOff1, himl1->cx, himl1->cy, himl1->hdcMask,  nX1, 0, SRCCOPY);
+        if (i2 >= 0 && i2 < himl2->cCurImage)
+            BitBlt (himlDst->hdcMask,  xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcMask,  nX2, 0, SRCAND);
 
 	himlDst->cCurImage = 1;
     }
@@ -2052,7 +2054,7 @@
     }
 
     if ((i < -1) || (i >= himl->cCurImage)) {
-        ERR("index out of range! %d\n", i);
+        TRACE("index out of range! %d\n", i);
         return FALSE;
     }
 
@@ -2247,7 +2249,7 @@
     ICONINFO  ii;
     BITMAP  bmp;
 
-    TRACE("(0x%lx 0x%x %p)\n", (DWORD)himl, i, hIcon);
+    TRACE("(%p %d %p)\n", himl, i, hIcon);
 
     if (!is_valid(himl))
 	return -1;
@@ -2305,6 +2307,7 @@
     if (ii.hbmMask)
 	DeleteObject (ii.hbmMask);
 
+    TRACE("Insert index = %d, himl->cCurImage = %d\n", nIndex, himl->cCurImage);
     return nIndex;
 }
 
@@ -2850,6 +2853,31 @@
 
         hbmNewBitmap = CreateBitmap (width, height, 1, himl->uBitsPixel, NULL);
     }
-
+    TRACE("returning %p\n", hbmNewBitmap);
     return hbmNewBitmap;
 }
+
+/*************************************************************************
+ * ImageList_SetColorTable [COMCTL32.@]
+ *
+ * Sets the color table of an image list.
+ *
+ * PARAMS
+ *     himl        [I] Handle to the image list.
+ *     uStartIndex [I] The first index to set.
+ *     cEntries    [I] Number of entries to set.
+ *     prgb        [I] New color information for color table for the image list.
+ *
+ * RETURNS
+ *     Success: Number of entries in the table that were set.
+ *     Failure: Zero.
+ *
+ * SEE
+ *     ImageList_Create(), SetDIBColorTable()
+ */
+
+UINT WINAPI
+ImageList_SetColorTable (HIMAGELIST himl, UINT uStartIndex, UINT cEntries, CONST RGBQUAD * prgb)
+{
+    return SetDIBColorTable(himl->hdcImage, uStartIndex, cEntries, prgb);
+}

reactos/lib/comctl32
pager.c 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- pager.c	19 Sep 2004 09:50:06 -0000	1.4
+++ pager.c	20 Oct 2004 08:36:55 -0000	1.5
@@ -21,11 +21,21 @@
  *    Tested primarily with the controlspy Pager application.
  *       Susan Farley (susan@codeweavers.com)
  *
+ * This code was audited for completeness against the documented features
+ * of Comctl32.dll version 6.0 on Sep. 18, 2004, by Robert Shearman.
+ * 
+ * Unless otherwise noted, we believe this code to be complete, as per
+ * the specification mentioned above.
+ * If you discover missing features or bugs please note them below.
+ *
  * TODO:
  *    Implement repetitive button press.
  *    Adjust arrow size relative to size of button.
  *    Allow border size changes.
- *    Implement drag and drop style.
+ *    Styles:
+ *      PGS_DRAGNDROP
+ *    Notifications:
+ *      PGN_HOTITEMCHANGE
  */
 
 #include <stdarg.h>
@@ -70,6 +80,34 @@
 #define INITIAL_DELAY    500
 #define REPEAT_DELAY     50
 
+static void
+PAGER_GetButtonRects(HWND hwnd, PAGER_INFO* infoPtr, RECT* prcTopLeft, RECT* prcBottomRight, BOOL bClientCoords)
+{
+    RECT rcWindow;
+    GetWindowRect (hwnd, &rcWindow);
+
+    if (bClientCoords)
+    {
+        POINT pt = {rcWindow.left, rcWindow.top};
+        ScreenToClient(hwnd, &pt);
+        OffsetRect(&rcWindow, -(rcWindow.left-pt.x), -(rcWindow.top-pt.y));
+    }
+    else
+        OffsetRect(&rcWindow, -rcWindow.left, -rcWindow.top);
+
+    *prcTopLeft = *prcBottomRight = rcWindow;
+    if (PAGER_IsHorizontal(hwnd))
+    {
+        prcTopLeft->right = prcTopLeft->left + infoPtr->nButtonSize;
+        prcBottomRight->left = prcBottomRight->right - infoPtr->nButtonSize;
+    }
+    else
+    {
+        prcTopLeft->bottom = prcTopLeft->top + infoPtr->nButtonSize;
+        prcBottomRight->top = prcBottomRight->bottom - infoPtr->nButtonSize;
+    }
+}
+
 /* the horizontal arrows are:
  *
  * 01234    01234
@@ -178,7 +216,9 @@
     HBRUSH   hBrush, hOldBrush;
     RECT     rc = arrowRect;
 
-    if (!btnState) /* PGF_INVISIBLE */
+    TRACE("arrowRect = %s, btnState = %d\n", wine_dbgstr_rect(&arrowRect), btnState);
+
+    if (btnState == PGF_INVISIBLE)
         return;
 
     if ((rc.right - rc.left <= 0) || (rc.bottom - rc.top <= 0))
@@ -234,33 +274,6 @@
     DeleteObject(hBrush);
 }
 
-static void PAGER_CaptureandTrack(PAGER_INFO *infoPtr, HWND hwnd)
-{
-    TRACKMOUSEEVENT trackinfo;
-
-    TRACE("[%p] SetCapture\n", hwnd);
-    SetCapture(hwnd);
-    infoPtr->bCapture = TRUE;
-
-    trackinfo.cbSize = sizeof(TRACKMOUSEEVENT);
-    trackinfo.dwFlags = TME_QUERY;
-    trackinfo.hwndTrack = hwnd;
-    trackinfo.dwHoverTime = HOVER_DEFAULT;
-
-    /* call _TrackMouseEvent to see if we are currently tracking for this hwnd */
-    _TrackMouseEvent(&trackinfo);
-
-    /* Make sure tracking is enabled so we receive a WM_MOUSELEAVE message */
-    if(!(trackinfo.dwFlags & TME_LEAVE)) {
-	trackinfo.dwFlags = TME_LEAVE; /* notify upon leaving */
-
-	/* call TRACKMOUSEEVENT so we receive a WM_MOUSELEAVE message */
-	/* and can properly deactivate the hot button */
-	_TrackMouseEvent(&trackinfo);
-    }
-}
-
-
 /* << PAGER_GetDropTarget >> */
 
 static inline LRESULT
@@ -425,95 +438,60 @@
 }
 
 static void
-PAGER_GrayAndRestoreBtns(PAGER_INFO* infoPtr, INT scrollRange,
-                         BOOL* needsResize, BOOL* needsRepaint)
+PAGER_UpdateBtns(HWND hwnd, PAGER_INFO *infoPtr,
+                 INT scrollRange, BOOL hideGrayBtns)
 {
+    BOOL resizeClient;
+    BOOL repaintBtns;
+    INT oldTLbtnState = infoPtr->TLbtnState;
+    INT oldBRbtnState = infoPtr->BRbtnState;
+    POINT pt;
+    RECT rcTopLeft, rcBottomRight;
+
+    /* get button rects */
+    PAGER_GetButtonRects(hwnd, infoPtr, &rcTopLeft, &rcBottomRight, FALSE);
+
+    GetCursorPos(&pt);
+
+    /* update states based on scroll position */
     if (infoPtr->nPos > 0)
     {
-        *needsResize |= !infoPtr->TLbtnState; /* PGF_INVISIBLE */
-        if (infoPtr->TLbtnState != PGF_DEPRESSED)
+        if (infoPtr->TLbtnState == PGF_INVISIBLE || infoPtr->TLbtnState == PGF_GRAYED)
             infoPtr->TLbtnState = PGF_NORMAL;
     }
-    else
-    {
-        *needsRepaint |= (infoPtr->TLbtnState != PGF_GRAYED);
+    else if (PtInRect(&rcTopLeft, pt))
         infoPtr->TLbtnState = PGF_GRAYED;
-    }
+    else
+        infoPtr->TLbtnState = PGF_INVISIBLE;
 
     if (scrollRange <= 0)
     {
-        *needsRepaint |= (infoPtr->TLbtnState != PGF_GRAYED);
-        infoPtr->TLbtnState = PGF_GRAYED;
-        *needsRepaint |= (infoPtr->BRbtnState != PGF_GRAYED);
-        infoPtr->BRbtnState = PGF_GRAYED;
+        infoPtr->TLbtnState = PGF_INVISIBLE;
+        infoPtr->BRbtnState = PGF_INVISIBLE;
     }
     else if (infoPtr->nPos < scrollRange)
     {
-        *needsResize |= !infoPtr->BRbtnState; /* PGF_INVISIBLE */
-        if (infoPtr->BRbtnState != PGF_DEPRESSED)
+        if (infoPtr->BRbtnState == PGF_INVISIBLE || infoPtr->BRbtnState == PGF_GRAYED)
             infoPtr->BRbtnState = PGF_NORMAL;
     }
-    else
-    {
-        *needsRepaint |= (infoPtr->BRbtnState != PGF_GRAYED);
+    else if (PtInRect(&rcBottomRight, pt))
         infoPtr->BRbtnState = PGF_GRAYED;
-    }
-}
-
-
-static void
-PAGER_NormalizeBtns(PAGER_INFO* infoPtr, BOOL* needsRepaint)
-{
-    if (infoPtr->TLbtnState & (PGF_HOT | PGF_DEPRESSED))
-    {
-        infoPtr->TLbtnState = PGF_NORMAL;
-        *needsRepaint = TRUE;
-    }
-
-    if (infoPtr->BRbtnState & (PGF_HOT | PGF_DEPRESSED))
-    {
-        infoPtr->BRbtnState = PGF_NORMAL;
-        *needsRepaint = TRUE;
-    }
-}
-
-static void
-PAGER_HideGrayBtns(PAGER_INFO* infoPtr, BOOL* needsResize)
-{
-    if (infoPtr->TLbtnState == PGF_GRAYED)
-    {
-        infoPtr->TLbtnState = PGF_INVISIBLE;
-        *needsResize = TRUE;
-    }
-
-    if (infoPtr->BRbtnState == PGF_GRAYED)
-    {
-        infoPtr->BRbtnState = PGF_INVISIBLE;
-        *needsResize = TRUE;
-    }
-}
-
-static void
-PAGER_UpdateBtns(HWND hwnd, PAGER_INFO *infoPtr,
-                 INT scrollRange, BOOL hideGrayBtns)
-{
-    BOOL resizeClient = FALSE;
-    BOOL repaintBtns = FALSE;
-
-    if (scrollRange < 0)
-        PAGER_NormalizeBtns(infoPtr, &repaintBtns);
     else
-        PAGER_GrayAndRestoreBtns(infoPtr, scrollRange, &resizeClient, &repaintBtns);
-
-    if (hideGrayBtns)
-        PAGER_HideGrayBtns(infoPtr, &resizeClient);
+        infoPtr->BRbtnState = PGF_INVISIBLE;
 
-    if (resizeClient) /* initiate NCCalcSize to resize client wnd */ {
+    /* only need to resize when entering or leaving PGF_INVISIBLE state */
+    resizeClient =
+        ((oldTLbtnState == PGF_INVISIBLE) != (infoPtr->TLbtnState == PGF_INVISIBLE)) ||
+        ((oldBRbtnState == PGF_INVISIBLE) != (infoPtr->BRbtnState == PGF_INVISIBLE));
+    /* initiate NCCalcSize to resize client wnd if necessary */
+    if (resizeClient)
         SetWindowPos(hwnd, 0,0,0,0,0,
                      SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE |
                      SWP_NOZORDER | SWP_NOACTIVATE);
-    }
 
+    /* repaint when changing any state */
+    repaintBtns = (oldTLbtnState != infoPtr->TLbtnState) || 
+                  (oldBRbtnState != infoPtr->BRbtnState);
     if (repaintBtns)
         SendMessageW(hwnd, WM_NCPAINT, 0, 0);
 }
@@ -667,10 +645,7 @@
             PAGER_SetPos(hwnd, 0, FALSE);
         }
         else
-        {
-            PAGER_UpdateBtns(hwnd, infoPtr, scrollRange, TRUE);
             PAGER_PositionChildWnd(hwnd, infoPtr);
-        }
     }
 
     return 1;
@@ -891,10 +866,7 @@
 {
     PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
     LPRECT lpRect = (LPRECT)lParam;
-    RECT rcChildw, rcmyw, wnrc, ltrc, rbrc;
-    POINT cursor;
-    BOOL resizeClient = FALSE;
-    BOOL repaintBtns = FALSE;
+    RECT rcChild, rcWindow;
     INT scrollRange;
 
     /*
@@ -906,43 +878,19 @@
 
     DefWindowProcW (hwnd, WM_NCCALCSIZE, wParam, lParam);
 
-    TRACE("orig rect=(%ld,%ld)-(%ld,%ld)\n",
-	  lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
+    TRACE("orig rect=%s\n", wine_dbgstr_rect(lpRect));
+
+    GetWindowRect (infoPtr->hwndChild, &rcChild);
+    MapWindowPoints (0, hwnd, (LPPOINT)&rcChild, 2); /* FIXME: RECT != 2 POINTS */
+    GetWindowRect (hwnd, &rcWindow);
 
     if (PAGER_IsHorizontal(hwnd))
     {
 	infoPtr->nWidth = lpRect->right - lpRect->left;
 	PAGER_CalcSize (hwnd, &infoPtr->nWidth, TRUE);
-	GetWindowRect (infoPtr->hwndChild, &rcChildw);
-	MapWindowPoints (0, hwnd, (LPPOINT)&rcChildw, 2);
-	GetCursorPos (&cursor);
-	GetWindowRect (hwnd, &rcmyw);
-
-	/* Reset buttons and hide any grey ones */
-	scrollRange = infoPtr->nWidth - (rcmyw.right - rcmyw.left);
-
-	TRACE("nPos=%d, scrollrange=%d, nHeigth=%d, myw=(%ld,%ld)-(%ld,%ld), cursor=(%ld,%ld)\n",
-	      infoPtr->nPos, scrollRange, infoPtr->nHeight,
-	      rcmyw.left, rcmyw.top,
-	      rcmyw.right, rcmyw.bottom,
-	      cursor.x, cursor.y);
-	PAGER_GrayAndRestoreBtns(infoPtr, scrollRange, &resizeClient, &repaintBtns);
-	PAGER_HideGrayBtns(infoPtr, &resizeClient);
-
-	if (PtInRect (&rcmyw, cursor)) {
-	    GetWindowRect (hwnd, &wnrc);
-	    ltrc = wnrc;
-	    ltrc.right = ltrc.left + infoPtr->nButtonSize;
-	    rbrc = wnrc;
-	    rbrc.left = rbrc.right - infoPtr->nButtonSize;
-	    TRACE("horz lt rect=(%ld,%ld)-(%ld,%ld), rb rect=(%ld,%ld)-(%ld,%ld)\n",
-		  ltrc.left, ltrc.top, ltrc.right, ltrc.bottom,
-		  rbrc.left, rbrc.top, rbrc.right, rbrc.bottom);
-	    if (PtInRect (&ltrc, cursor) && infoPtr->TLbtnState)
-		RedrawWindow (hwnd, 0, 0, RDW_INVALIDATE | RDW_ERASE);
-	    if (PtInRect (&rbrc, cursor) && infoPtr->BRbtnState)
-		RedrawWindow (hwnd, 0, 0, RDW_INVALIDATE | RDW_ERASE);
-	}
+
+	scrollRange = infoPtr->nWidth - (rcWindow.right - rcWindow.left);
+
 	if (infoPtr->TLbtnState && (lpRect->left + infoPtr->nButtonSize < lpRect->right))
 	    lpRect->left += infoPtr->nButtonSize;
 	if (infoPtr->BRbtnState && (lpRect->right - infoPtr->nButtonSize > lpRect->left))
@@ -950,65 +898,21 @@
     }
     else
     {
-	/* native does: (from trace of IE4 opening "Favorites" frame)
-	 *        DefWindowProc
-	 *        WM_NOITFY  PGN_CALCSIZE w/ dwFlag=2
-	 *        GetWindowRect (child, &rc)
-         *        MapWindowPoints (0, syspager, &rc, 2)
-         *        GetCursorPos( &cur )
-         *        GetWindowRect (syspager, &rc2)
-         *        PtInRect (&rc2, cur.x, cur.y) rtns 0
-         *        returns with rect empty
-	 */
 	infoPtr->nHeight = lpRect->bottom - lpRect->top;
 	PAGER_CalcSize (hwnd, &infoPtr->nHeight, FALSE);
-	GetWindowRect (infoPtr->hwndChild, &rcChildw);
-	MapWindowPoints (0, hwnd, (LPPOINT)&rcChildw, 2);
-	GetCursorPos (&cursor);
-	GetWindowRect (hwnd, &rcmyw);
-
-	/* Reset buttons and hide any grey ones */
-	scrollRange = infoPtr->nHeight - (rcmyw.bottom - rcmyw.top);
-
-	TRACE("nPos=%d, scrollrange=%d, nHeigth=%d, myw=(%ld,%ld)-(%ld,%ld), cursor=(%ld,%ld)\n",
-	      infoPtr->nPos, scrollRange, infoPtr->nHeight,
-	      rcmyw.left, rcmyw.top,
-	      rcmyw.right, rcmyw.bottom,
-	      cursor.x, cursor.y);
-	PAGER_GrayAndRestoreBtns(infoPtr, scrollRange, &resizeClient, &repaintBtns);
-	PAGER_HideGrayBtns(infoPtr, &resizeClient);
-
-	if (PtInRect (&rcmyw, cursor)) {
-
-	    /* native does:
-	     *    GetWindowRect(pager, &rc)
-	     *    PtInRect(btn-left????, cur.x, cur.y)
-	     *    if true -> ???
-	     *    PtInRect(btn-right????, cur.x, cur.y)
-	     *    if true
-	     *      RedrawWindow(pager, 0, 0, 5)
-	     *      return TRUE
-	     */
-
-	    GetWindowRect (hwnd, &wnrc);
-	    ltrc = wnrc;
-	    ltrc.right = ltrc.left + infoPtr->nButtonSize;
-	    rbrc = wnrc;
-	    rbrc.left = rbrc.right - infoPtr->nButtonSize;
-	    TRACE("vert lt rect=(%ld,%ld)-(%ld,%ld), rb rect=(%ld,%ld)-(%ld,%ld)\n",
-		  ltrc.left, ltrc.top, ltrc.right, ltrc.bottom,
-		  rbrc.left, rbrc.top, rbrc.right, rbrc.bottom);
-	    if (PtInRect (&ltrc, cursor) && infoPtr->TLbtnState)
-		RedrawWindow (hwnd, 0, 0, RDW_INVALIDATE | RDW_ERASE);
-	    if (PtInRect (&rbrc, cursor) && infoPtr->BRbtnState)
-		RedrawWindow (hwnd, 0, 0, RDW_INVALIDATE | RDW_ERASE);
-	}
+
+	scrollRange = infoPtr->nHeight - (rcWindow.bottom - rcWindow.top);
+
 	if (infoPtr->TLbtnState && (lpRect->top + infoPtr->nButtonSize < lpRect->bottom))
 	    lpRect->top += infoPtr->nButtonSize;
 	if (infoPtr->BRbtnState && (lpRect->bottom - infoPtr->nButtonSize > lpRect->top))
 	    lpRect->bottom -= infoPtr->nButtonSize;
     }
 
+    TRACE("nPos=%d, nHeigth=%d, window=%s\n",
+          infoPtr->nPos, infoPtr->nHeight,
+          wine_dbgstr_rect(&rcWindow));
+
     TRACE("[%p] client rect set to %ldx%ld at (%ld,%ld) BtnState[%d,%d]\n",
 	  hwnd, lpRect->right-lpRect->left, lpRect->bottom-lpRect->top,
 	  lpRect->left, lpRect->top,
@@ -1022,7 +926,7 @@
 {
     PAGER_INFO* infoPtr = PAGER_GetInfoPtr(hwnd);
     DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
-    RECT rcWindow, rcBottomRight, rcTopLeft;
+    RECT rcBottomRight, rcTopLeft;
     HDC hdc;
     BOOL bHorizontal = PAGER_IsHorizontal(hwnd);
 
@@ -1034,20 +938,7 @@
     if (!(hdc = GetDCEx (hwnd, 0, DCX_USESTYLE | DCX_WINDOW)))
         return 0;
 
-    GetWindowRect (hwnd, &rcWindow);
-    OffsetRect (&rcWindow, -rcWindow.left, -rcWindow.top);
-
-    rcTopLeft = rcBottomRight = rcWindow;
-    if (bHorizontal)
-    {
-        rcTopLeft.right = rcTopLeft.left + infoPtr->nButtonSize;
-        rcBottomRight.left = rcBottomRight.right - infoPtr->nButtonSize;
-    }
-    else
-    {
-        rcTopLeft.bottom = rcTopLeft.top + infoPtr->nButtonSize;
-        rcBottomRight.top = rcBottomRight.bottom - infoPtr->nButtonSize;
-    }
+    PAGER_GetButtonRects(hwnd, infoPtr, &rcTopLeft, &rcBottomRight, FALSE);
 
     PAGER_DrawButton(hdc, infoPtr->clrBk, rcTopLeft,
                      bHorizontal, TRUE, infoPtr->TLbtnState);
@@ -1059,135 +950,52 @@
 }
 
 static INT
-PAGER_HitTest (HWND hwnd, LPPOINT pt)
+PAGER_HitTest (HWND hwnd, const POINT * pt)
 {
     PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
-    RECT clientRect;
-    BOOL bHorizontal = PAGER_IsHorizontal(hwnd);
+    RECT clientRect, rcTopLeft, rcBottomRight;
+    POINT ptWindow;
 
     GetClientRect (hwnd, &clientRect);
 
     if (PtInRect(&clientRect, *pt))
     {
-        TRACE("HTCLIENT\n");
-        return HTCLIENT;
+        TRACE("child\n");
+        return -1;
     }
 
-    if (infoPtr->TLbtnState && infoPtr->TLbtnState != PGF_GRAYED)
+    ptWindow = *pt;
+    PAGER_GetButtonRects(hwnd, infoPtr, &rcTopLeft, &rcBottomRight, TRUE);
+
+    if ((infoPtr->TLbtnState != PGF_INVISIBLE) && PtInRect(&rcTopLeft, ptWindow))
     {
-        if (bHorizontal)
-        {
-            if (pt->x < clientRect.left)
-            {
-                TRACE("HTLEFT\n");
-                return HTLEFT;
-            }
-        }
-        else
-        {
-            if (pt->y < clientRect.top)
-            {
-                TRACE("HTTOP\n");
-                return HTTOP;
-            }
-        }
+        TRACE("PGB_TOPORLEFT\n");
+        return PGB_TOPORLEFT;
     }
-
-    if (infoPtr->BRbtnState && infoPtr->BRbtnState != PGF_GRAYED)
+    else if ((infoPtr->BRbtnState != PGF_INVISIBLE) && PtInRect(&rcBottomRight, ptWindow))
     {
-        if (bHorizontal)
-        {
-            if (pt->x > clientRect.right)
-            {
-                TRACE("HTRIGHT\n");
-                return HTRIGHT;
-            }
-        }
-        else
-        {
-            if (pt->y > clientRect.bottom)
-            {
-                TRACE("HTBOTTOM\n");
-                return HTBOTTOM;
-            }
-        }
+        TRACE("PGB_BOTTOMORRIGHT\n");
+        return PGB_BOTTOMORRIGHT;
     }
 
-    TRACE("HTNOWHERE\n");
-    return HTNOWHERE;
+    TRACE("nowhere\n");
+    return -1;
 }
 
 static LRESULT
 PAGER_NCHitTest (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
     POINT pt;
+    INT nHit;
 
     pt.x = (short)LOWORD(lParam);
     pt.y = (short)HIWORD(lParam);
 
     ScreenToClient (hwnd, &pt);
-    return PAGER_HitTest(hwnd, &pt);
-}
-
-static LRESULT
-PAGER_SetCursor( HWND hwnd, WPARAM wParam, LPARAM lParam )
-{
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
-    BOOL notCaptured = FALSE;
-
-    switch(LOWORD(lParam))
-    {
-        case HTLEFT:
-        case HTTOP:
-            if ((notCaptured = infoPtr->TLbtnState != PGF_HOT))
-                infoPtr->TLbtnState = PGF_HOT;
-            break;
-        case HTRIGHT:
-        case HTBOTTOM:
-            if ((notCaptured = infoPtr->BRbtnState != PGF_HOT))
-               infoPtr->BRbtnState = PGF_HOT;
-            break;
-        default:
-            return FALSE;
-    }
-
-    if (notCaptured)
-    {
-	PAGER_CaptureandTrack(infoPtr, hwnd);
-
-        SendMessageW(hwnd, WM_NCPAINT, 0, 0);
-    }
-
-    return TRUE;
-}
-
-static LRESULT
-PAGER_MouseLeave (HWND hwnd, WPARAM wParam, LPARAM lParam)
-{
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
-
-    KillTimer (hwnd, TIMERID1);
-    KillTimer (hwnd, TIMERID2);
-
-    TRACE("[%p] ReleaseCapture\n", hwnd);
-    ReleaseCapture();
-    infoPtr->bCapture = FALSE;
-
-    /* Notify parent of released mouse capture */
-    {
-        NMHDR nmhdr;
-        ZeroMemory (&nmhdr, sizeof (NMHDR));
-        nmhdr.hwndFrom = hwnd;
-        nmhdr.idFrom   = GetWindowLongPtrW (hwnd, GWLP_ID);
-        nmhdr.code = NM_RELEASEDCAPTURE;
-        SendMessageW (infoPtr->hwndNotify, WM_NOTIFY,
-                        (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
-    }
-
-    /* make HOT btns NORMAL and hide gray btns */
-    PAGER_UpdateBtns(hwnd, infoPtr, -1, TRUE);
-
-    return TRUE;
+    nHit = PAGER_HitTest(hwnd, &pt);
+    if (nHit < 0)
+        return HTTRANSPARENT;
+    return HTCLIENT;
 }
 
 static LRESULT
@@ -1195,7 +1003,7 @@
 {
     PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
     POINT clpt, pt;
-    RECT wnrect, TLbtnrect, BRbtnrect, *btnrect = NULL;
+    RECT wnrect, *btnrect = NULL;
     DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
     BOOL topLeft = FALSE;
     INT btnstate = 0;
@@ -1209,75 +1017,103 @@
     ClientToScreen(hwnd, &pt);
     GetWindowRect(hwnd, &wnrect);
     if (PtInRect(&wnrect, pt)) {
-	TLbtnrect = wnrect;
-	BRbtnrect = wnrect;
-	if (dwStyle & PGS_HORZ) {
-	    TLbtnrect.right = TLbtnrect.left + infoPtr->nButtonSize;
-	    BRbtnrect.left = BRbtnrect.right - infoPtr->nButtonSize;
-	}
-	else {
-	    TLbtnrect.bottom = TLbtnrect.top + infoPtr->nButtonSize;
-	    BRbtnrect.top = BRbtnrect.bottom - infoPtr->nButtonSize;
-	}
+        RECT TLbtnrect, BRbtnrect;
+        PAGER_GetButtonRects(hwnd, infoPtr, &TLbtnrect, &BRbtnrect, FALSE);
 
 	clpt = pt;
 	MapWindowPoints(0, hwnd, &clpt, 1);
 	hit = PAGER_HitTest(hwnd, &clpt);
-	if (hit == HTLEFT || hit == HTTOP) {
+	if ((hit == PGB_TOPORLEFT) && (infoPtr->TLbtnState == PGF_NORMAL))
+	{
 	    topLeft = TRUE;
 	    btnrect = &TLbtnrect;
-	    infoPtr->TLbtnState = PGF_DEPRESSED;
+	    infoPtr->TLbtnState = PGF_HOT;
 	    btnstate = infoPtr->TLbtnState;
 	}
-	else if (hit == HTRIGHT || hit == HTBOTTOM) {
+	else if ((hit == PGB_BOTTOMORRIGHT) && (infoPtr->BRbtnState == PGF_NORMAL))
+	{
 	    topLeft = FALSE;
 	    btnrect = &BRbtnrect;
-	    infoPtr->BRbtnState = PGF_DEPRESSED;
+	    infoPtr->BRbtnState = PGF_HOT;
 	    btnstate = infoPtr->BRbtnState;
 	}
 
 	/* If in one of the buttons the capture and draw buttons */
-	if (btnrect) {
+	if (btnrect)
+	{
 	    TRACE("[%p] draw btn (%ld,%ld)-(%ld,%ld), Capture %s, style %08lx\n",
 		  hwnd, btnrect->left, btnrect->top,
 		  btnrect->right, btnrect->bottom,
 		  (infoPtr->bCapture) ? "TRUE" : "FALSE",
 		  dwStyle);
 	    if (!infoPtr->bCapture)
-		PAGER_CaptureandTrack(infoPtr, hwnd);
+	    {
+	        TRACE("[%p] SetCapture\n", hwnd);
+	        SetCapture(hwnd);
+	        infoPtr->bCapture = TRUE;
+	    }
 	    if (dwStyle & PGS_AUTOSCROLL)
 		SetTimer(hwnd, TIMERID1, 0x3e, 0);
-	    MapWindowPoints(0, hwnd, (LPPOINT)btnrect, 2);
 	    hdc = GetWindowDC(hwnd);
 	    /* OffsetRect(wnrect, 0 | 1, 0 | 1) */
 	    PAGER_DrawButton(hdc, infoPtr->clrBk, *btnrect,
 			     PAGER_IsHorizontal(hwnd), topLeft, btnstate);
 	    ReleaseDC(hwnd, hdc);
-	    return DefWindowProcW (hwnd, WM_MOUSEMOVE, wParam, lParam);
+	    return 0;
 	}
     }
 
     /* If we think we are captured, then do release */
-    if (infoPtr->bCapture) {
-	infoPtr->bCapture = FALSE;
+    if (infoPtr->bCapture && (WindowFromPoint(pt) != hwnd))
+    {
+    	NMHDR nmhdr;
 
-        if (GetCapture() == hwnd) {
-	    ReleaseCapture();
-	    /* Notify parent of released mouse capture */
-	    {
-		NMHDR nmhdr;
-		ZeroMemory (&nmhdr, sizeof (NMHDR));
-		nmhdr.hwndFrom = hwnd;
-		nmhdr.idFrom   = GetWindowLongPtrW (hwnd, GWLP_ID);
-		nmhdr.code = NM_RELEASEDCAPTURE;
-		SendMessageW (infoPtr->hwndNotify, WM_NOTIFY,
-			      (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
-	    }
-	}
-	if (IsWindow(hwnd))
-	    KillTimer(hwnd, TIMERID1);
+        infoPtr->bCapture = FALSE;
+
+        if (GetCapture() == hwnd)
+        {
+            ReleaseCapture();
+
+            if (infoPtr->TLbtnState == PGF_GRAYED)
+            {
+                infoPtr->TLbtnState = PGF_INVISIBLE;
+                SetWindowPos(hwnd, 0,0,0,0,0,
+                             SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE |
+                             SWP_NOZORDER | SWP_NOACTIVATE);
+            }
+            else if (infoPtr->TLbtnState == PGF_HOT)
+            {
+        	infoPtr->TLbtnState = PGF_NORMAL;
+        	/* FIXME: just invalidate button rect */
+                RedrawWindow(hwnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE);
+            }
+
+            if (infoPtr->BRbtnState == PGF_GRAYED)
+            {
+                infoPtr->BRbtnState = PGF_INVISIBLE;
+                SetWindowPos(hwnd, 0,0,0,0,0,
+                             SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE |
+                             SWP_NOZORDER | SWP_NOACTIVATE);
+            }
+            else if (infoPtr->BRbtnState == PGF_HOT)
+            {
+        	infoPtr->BRbtnState = PGF_NORMAL;
+        	/* FIXME: just invalidate button rect */
+                RedrawWindow(hwnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE);
+            }
+
+            /* Notify parent of released mouse capture */
+        	memset(&nmhdr, 0, sizeof(NMHDR));
+        	nmhdr.hwndFrom = hwnd;
+        	nmhdr.idFrom   = GetWindowLongPtrW(hwnd, GWLP_ID);
+        	nmhdr.code = NM_RELEASEDCAPTURE;
+        	SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,
+                         (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
+        }
+        if (IsWindow(hwnd))
+            KillTimer(hwnd, TIMERID1);
     }
-    return DefWindowProcW (hwnd, WM_MOUSEMOVE, wParam, lParam);
+    return 0;
 }
 
 static LRESULT
@@ -1296,13 +1132,13 @@
     hit = PAGER_HitTest(hwnd, &pt);
 
     /* put btn in DEPRESSED state */
-    if (hit == HTLEFT || hit == HTTOP)
+    if (hit == PGB_TOPORLEFT)
     {
         repaintBtns = infoPtr->TLbtnState != PGF_DEPRESSED;
         infoPtr->TLbtnState = PGF_DEPRESSED;
         SetTimer(hwnd, TIMERID1, INITIAL_DELAY, 0);
     }
-    else if (hit == HTRIGHT || hit == HTBOTTOM)
+    else if (hit == PGB_BOTTOMORRIGHT)
     {
         repaintBtns = infoPtr->BRbtnState != PGF_DEPRESSED;
         infoPtr->BRbtnState = PGF_DEPRESSED;
@@ -1314,21 +1150,29 @@
 
     switch(hit)
     {
-    case HTLEFT:
-        TRACE("[%p] PGF_SCROLLLEFT\n", hwnd);
-        PAGER_Scroll(hwnd, PGF_SCROLLLEFT);
-        break;
-    case HTTOP:
-        TRACE("[%p] PGF_SCROLLUP\n", hwnd);
-        PAGER_Scroll(hwnd, PGF_SCROLLUP);
-        break;
-    case HTRIGHT:
-        TRACE("[%p] PGF_SCROLLRIGHT\n", hwnd);
-        PAGER_Scroll(hwnd, PGF_SCROLLRIGHT);
+    case PGB_TOPORLEFT:
+        if (PAGER_IsHorizontal(hwnd))
+        {
+            TRACE("[%p] PGF_SCROLLLEFT\n", hwnd);
+            PAGER_Scroll(hwnd, PGF_SCROLLLEFT);
+        }
+        else
+        {
+            TRACE("[%p] PGF_SCROLLUP\n", hwnd);
+            PAGER_Scroll(hwnd, PGF_SCROLLUP);
+        }
         break;
-    case HTBOTTOM:
-        TRACE("[%p] PGF_SCROLLDOWN\n", hwnd);
-        PAGER_Scroll(hwnd, PGF_SCROLLDOWN);
+    case PGB_BOTTOMORRIGHT:
+        if (PAGER_IsHorizontal(hwnd))
+        {
+            TRACE("[%p] PGF_SCROLLRIGHT\n", hwnd);
+            PAGER_Scroll(hwnd, PGF_SCROLLRIGHT);
+        }
+        else
+        {
+            TRACE("[%p] PGF_SCROLLDOWN\n", hwnd);
+            PAGER_Scroll(hwnd, PGF_SCROLLDOWN);
+        }
         break;
     default:
         break;
@@ -1347,26 +1191,15 @@
     KillTimer (hwnd, TIMERID2);
 
     /* make PRESSED btns NORMAL but don't hide gray btns */
-    PAGER_UpdateBtns(hwnd, infoPtr, -1, FALSE);
+    if (infoPtr->TLbtnState & (PGF_HOT | PGF_DEPRESSED))
+        infoPtr->TLbtnState = PGF_NORMAL;
+    if (infoPtr->BRbtnState & (PGF_HOT | PGF_DEPRESSED))
+        infoPtr->BRbtnState = PGF_NORMAL;
 
     return 0;
 }
 
 static LRESULT
-PAGER_NCLButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
-{
-    POINT pt;
-
-    pt.x = (short)LOWORD(lParam);
-    pt.y = (short)HIWORD(lParam);
-
-    TRACE("[%p] at (%ld,%ld)\n", hwnd, pt.x, pt.y );
-    MapWindowPoints(0, hwnd, &pt, 1);
-    lParam = MAKELONG(pt.x, pt.y);
-    return PAGER_LButtonDown (hwnd, wParam, lParam);
-}
-
-static LRESULT
 PAGER_Timer (HWND hwnd, WPARAM wParam)
 {
     PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
@@ -1375,14 +1208,12 @@
 
     /* if initial timer, kill it and start the repeat timer */
     if (wParam == TIMERID1) {
-	if (PAGER_IsHorizontal(hwnd)) {
-	    dir = (infoPtr->TLbtnState & PGF_DEPRESSED) ?
-		PGF_SCROLLLEFT : PGF_SCROLLRIGHT;
-	}
-	else {
-	    dir = (infoPtr->TLbtnState & PGF_DEPRESSED) ?
-		PGF_SCROLLUP : PGF_SCROLLDOWN;
-	}
+	if (infoPtr->TLbtnState == PGF_HOT)
+	    dir = PAGER_IsHorizontal(hwnd) ?
+		PGF_SCROLLLEFT : PGF_SCROLLUP;
+	else
+	    dir = PAGER_IsHorizontal(hwnd) ?
+		PGF_SCROLLRIGHT : PGF_SCROLLDOWN;
 	TRACE("[%p] TIMERID1: style=%08lx, dir=%d\n", hwnd, dwStyle, dir);
 	KillTimer(hwnd, TIMERID1);
 	SetTimer(hwnd, TIMERID1, REPEAT_DELAY, 0);
@@ -1412,15 +1243,6 @@
     HDC hdc = (HDC)wParam;
     HWND parent;
 
-    /* native does:
-     *   parent = GetParent(pager)
-     *   pt.x=0; pt.y=0; ?????
-     *   MapWindowPoints(pager, parent, &pt, 1)
-     *   OffsetWindowOrgEx(hdc, pt.x, pt.y, &ptorg)
-     *   SendMessageW(parent, WM_ERASEBKGND, hdc, 0)
-     *   SetWindowOrgEx(hdc, 0, 0, 0)
-     */
-
     pt.x = 0;
     pt.y = 0;
     parent = GetParent(hwnd);
@@ -1429,25 +1251,6 @@
     SendMessageW (parent, WM_ERASEBKGND, wParam, lParam);
     SetWindowOrgEx (hdc, ptorig.x, ptorig.y, 0);
 
-
-#if 0
-    PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
-    HBRUSH hBrush = CreateSolidBrush(infoPtr->clrBk);
-    RECT rect;
-
-    GetClientRect (hwnd, &rect);
-    FillRect ((HDC)wParam, &rect, hBrush);
-
-    /* background color of the child should be the same as the pager */
-    if (infoPtr->hwndChild)
-    {
-        GetClientRect (infoPtr->hwndChild, &rect);
-        FillRect ((HDC)wParam, &rect, hBrush);
-    }
-
-    DeleteObject (hBrush);
-#endif
-
     return TRUE;
 }
 
@@ -1541,40 +1344,22 @@
         case WM_NCHITTEST:
             return PAGER_NCHitTest (hwnd, wParam, lParam);
 
-        case WM_SETCURSOR:
-        {
-            if (hwnd == (HWND)wParam)
-                return PAGER_SetCursor(hwnd, wParam, lParam);
-            else /* its for the child */
-                return 0;
-        }
-
         case WM_MOUSEMOVE:
             if (infoPtr->bForward && infoPtr->hwndChild)
                 PostMessageW(infoPtr->hwndChild, WM_MOUSEMOVE, wParam, lParam);
             return PAGER_MouseMove (hwnd, wParam, lParam);
 
-        case WM_MOUSELEAVE:
-            return PAGER_MouseLeave (hwnd, wParam, lParam);
-
-        case WM_NCLBUTTONDOWN:
-            return PAGER_NCLButtonDown (hwnd, wParam, lParam);
-
         case WM_LBUTTONDOWN:
             return PAGER_LButtonDown (hwnd, wParam, lParam);
 
-        case WM_NCLBUTTONUP:
         case WM_LBUTTONUP:
             return PAGER_LButtonUp (hwnd, wParam, lParam);
 
         case WM_ERASEBKGND:
             return PAGER_EraseBackground (hwnd, wParam, lParam);
-/*
-        case WM_PAINT:
-            return PAGER_Paint (hwnd, wParam);
-*/
+
         case WM_TIMER:
-	    return PAGER_Timer (hwnd, wParam);
+            return PAGER_Timer (hwnd, wParam);
 
         case WM_NOTIFY:
         case WM_COMMAND:

reactos/lib/comctl32
propsheet.c 1.13 -> 1.14
diff -u -r1.13 -r1.14
--- propsheet.c	19 Sep 2004 09:50:06 -0000	1.13
+++ propsheet.c	20 Oct 2004 08:36:55 -0000	1.14
@@ -34,13 +34,12 @@
  *   - Messages:
  *     o PSM_GETRESULT
  *     o PSM_IDTOINDEX
- *     o PSM_INDEXTOID
- *     o PSM_INDEXTOPAGE
  *     o PSM_INSERTPAGE
- *     o PSM_PAGETOINDEX
  *     o PSM_RECALCPAGESIZES
  *     o PSM_SETHEADERSUBTITLE
  *     o PSM_SETHEADERTITLE
+ *     o WM_HELP
+ *     o WM_CONTEXTMENU
  *   - Notifications:
  *     o PSN_GETOBJECT
  *     o PSN_QUERYINITIALFOCUS
@@ -48,10 +47,8 @@
  *   - Styles:
  *     o PSH_WIZARDHASFINISH
  *     o PSH_RTLREADING
- *     o PSH_WIZARDCONTEXTHELP
  *     o PSH_STRETCHWATERMARK
  *     o PSH_USEPAGELANG
- *     o PSH_NOCONTEXTHELP
  *     o PSH_USEPSTARTPAGE
  *   - Page styles:
  *     o PSP_USEFUSIONCONTEXT
@@ -237,18 +234,14 @@
    * unhandled header flags:
    *  PSH_WIZARDHASFINISH    0x00000010
    *  PSH_RTLREADING         0x00000800
-   *  PSH_WIZARDCONTEXTHELP  0x00001000
    *  PSH_STRETCHWATERMARK   0x00040000
    *  PSH_USEPAGELANG        0x00200000
-   *  PSH_NOCONTEXTHELP      0x02000000      also not in .h
    */
 
     add_flag(PSH_WIZARDHASFINISH);
     add_flag(PSH_RTLREADING);
-    add_flag(PSH_WIZARDCONTEXTHELP);
     add_flag(PSH_STRETCHWATERMARK);
     add_flag(PSH_USEPAGELANG);
-    add_flag(PSH_NOCONTEXTHELP);
     if (string[0] != '\0')
 	FIXME("%s\n", string);
 }
@@ -689,9 +682,29 @@
 
   memcpy(temp, template, resSize);
 
+  if (psInfo->ppshheader.dwFlags & PSH_NOCONTEXTHELP)
+  {
+    if (((MyDLGTEMPLATEEX*)temp)->signature == 0xFFFF)
+      ((MyDLGTEMPLATEEX*)temp)->style &= ~DS_CONTEXTHELP;
+    else
+      ((DLGTEMPLATE*)temp)->style &= ~DS_CONTEXTHELP;
+  }
+  if ((psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD) &&
+      (psInfo->ppshheader.dwFlags & PSH_WIZARDCONTEXTHELP))
+  {
+    if (((MyDLGTEMPLATEEX*)temp)->signature == 0xFFFF)
+      ((MyDLGTEMPLATEEX*)temp)->style |= DS_CONTEXTHELP;
+    else
+      ((DLGTEMPLATE*)temp)->style |= DS_CONTEXTHELP;
+  }
+
   if (psInfo->useCallback)
     (*(psInfo->ppshheader.pfnCallback))(0, PSCB_PRECREATE, (LPARAM)temp);
 
+  /* NOTE: MSDN states "Returns a positive value if successful, or -1
+   * otherwise for modal property sheets.", but this is wrong. The
+   * actual return value is either TRUE (success), FALSE (cancel) or
+   * -1 (error). */
   if( psInfo->unicode )
   {
     if (!(psInfo->ppshheader.dwFlags & PSH_MODELESS))
@@ -2568,7 +2581,16 @@
  */
 static LRESULT PROPSHEET_PageToIndex(HWND hwndDlg, HPROPSHEETPAGE hPage)
 {
-    FIXME("(%p, %p): stub\n", hwndDlg, hPage);
+    int index;
+    PropSheetInfo * psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
+                                                       PropSheetInfoStr);
+
+    TRACE("(%p, %p)\n", hwndDlg, hPage);
+
+    for (index = 0; index < psInfo->nPages; index++)
+        if (psInfo->proppage[index].hpage == hPage)
+            return index;
+    WARN("%p not found\n", hPage);
     return -1;
 }
 
@@ -2577,8 +2599,14 @@
  */
 static LRESULT PROPSHEET_IndexToPage(HWND hwndDlg, int iPageIndex)
 {
-    FIXME("(%p, %d): stub\n", hwndDlg, iPageIndex);
-    return 0;
+    PropSheetInfo * psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
+                                                       PropSheetInfoStr);
+    TRACE("(%p, %d)\n", hwndDlg, iPageIndex);
+    if (iPageIndex<0 || iPageIndex>=psInfo->nPages) {
+        WARN("%d out of range.\n", iPageIndex);
+	return 0;
+    }
+    return (LRESULT)psInfo->proppage[iPageIndex].hpage;
 }
 
 /******************************************************************************
@@ -2595,8 +2623,19 @@
  */
 static LRESULT PROPSHEET_IndexToId(HWND hwndDlg, int iPageIndex)
 {
-    FIXME("(%p, %d): stub\n", hwndDlg, iPageIndex);
-    return 0;
+    PropSheetInfo * psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
+                                                       PropSheetInfoStr);
+    LPCPROPSHEETPAGEW psp;
+    TRACE("(%p, %d)\n", hwndDlg, iPageIndex);
+    if (iPageIndex<0 || iPageIndex>=psInfo->nPages) {
+        WARN("%d out of range.\n", iPageIndex);
+	return 0;
+    }
+    psp = (LPCPROPSHEETPAGEW)psInfo->proppage[iPageIndex].hpage;
+    if (psp->dwFlags & PSP_DLGINDIRECT || HIWORD(psp->u.pszTemplate)) {
+        return 0;
+    }
+    return (LRESULT)psp->u.pszTemplate;
 }
 
 /******************************************************************************
@@ -3374,6 +3413,9 @@
       {
           PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwnd, PropSheetInfoStr);
 
+          if (!psInfo)
+              return FALSE;
+
           /* No default handler, forward notification to active page */
           if (psInfo->activeValid && psInfo->active_page != -1)
           {
@@ -3409,6 +3451,9 @@
                                                         PropSheetInfoStr);
       HWND hwndPage = 0;
 
+      if (!psInfo)
+        return FALSE;
+
       if (psInfo->activeValid && psInfo->active_page != -1)
         hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
 
@@ -3470,6 +3515,9 @@
       PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwnd,
                                                         PropSheetInfoStr);
 
+      if (!psInfo)
+        return FALSE;
+
       psInfo->restartWindows = TRUE;
       return TRUE;
     }
@@ -3479,6 +3527,9 @@
       PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwnd,
                                                         PropSheetInfoStr);
 
+      if (!psInfo)
+        return FALSE;
+
       psInfo->rebootSystem = TRUE;
       return TRUE;
     }

reactos/lib/comctl32
rebar.c 1.12 -> 1.13
diff -u -r1.12 -r1.13
--- rebar.c	19 Sep 2004 09:50:06 -0000	1.12
+++ rebar.c	20 Oct 2004 08:36:55 -0000	1.13
@@ -1,26 +1,5 @@
 /*
- * Testing: set to 1 to make background brush *always* green
- */
-#define GLATESTING 0
-
-/*
- *
- * 2.  At "FIXME:  problem # 2" WinRAR:
- *   if "#if 1" then last band draws in separate row
- *   if "#if 0" then last band draws in previous row *** just like native ***
- *
- */
-#define PROBLEM2 0
-
-/*
- * 3. REBAR_MoveChildWindows should have a loop because more than
- *    one pass is made (together with the RBN_CHILDSIZEs) is made on
- *    at least RB_INSERTBAND
- */
-
-
-/*
- * Rebar control    rev 8e
+ * Rebar control
  *
  * Copyright 1998, 1999 Eric Kohl
  *
@@ -38,105 +17,76 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * NOTES
- *   An author is needed! Any volunteers?
- *   I will only improve this control once in a while.
- *     Eric <ekohl@abo.rhein-zeitung.de>
  *
- * TODO:
- *   - vertical placement
- *   - ComboBox and ComboBoxEx placement
- *   - center image
- *   - Layout code.
- *   - Display code.
- *   - Some messages.
- *   - All notifications.
-
- * Changes Guy Albertelli <galberte@neo.lrun.com>
- *  rev 2,3,4
- *   - Implement initial version of row grouping, row separators,
- *     text and background colors. Support additional messages.
- *     Support RBBS_BREAK. Implement ERASEBKGND and improve painting.
- *  rev 5
- *   - implement support for dragging Gripper left or right in a row. Supports
- *     WM_LBUTTONDOWN, WM_LBUTTONUP, and WM_MOUSEMOVE. Also support
- *     RBS_BANDBORDERS.
- *  rev 6
- *   - Fix or implement notifications for RBN_HEIGHTCHANGE, RBN_CHILDSIZE.
- *   - Correct styles RBBS_NOGRIPPER, RBBS_GRIPPERALWAYS, and RBBS_FIXEDSIZE.
- *   - Fix algorithm for Layout and AdjustBand.
+ * This code was audited for completeness against the documented features
+ * of Comctl32.dll version 6.0 on Mar. 14, 2004, by Robert Shearman.
+ * 
+ * Unless otherwise noted, we believe this code to be complete, as per
+ * the specification mentioned above.
+ * If you discover missing features or bugs please note them below.
  *
- * rev 7
- *   - Fix algorithm for _Layout and _AdjustBand.
- *   - Fix or implement RBN_ENDDRAG, RB_MOVEBAND, WM_SETREDRAW,
- *     WM_STYLECHANGED, RB_MINIMIZEBAND, RBBS_VARIABLEHEIGHT, RBS_VARHEIGHT,
- *     RBBS_HIDDEN, WM_NOTIFYFORMAT, NM_NCHITTEST, WM_SETREDRAW, RBS_AUTOSIZE,
- *     WM_SETFONT, RBS_BORDERS
- *   - Create structures in WM_NCCREATE
- *   - Additional performance enhancements.
- *
- * rev 8
- *  1. Create array of start and end band indexes by row and use.
- *  2. Fix problem with REBAR_Layout Phase 2b to process only if only
- *     band in row.
- *  3. Set the Caption Font (Regular) as default font for text.
- *  4. Delete font handle on control distruction.
- *  5. Add UpdateWindow call in _MoveChildWindows to match repainting done
- *     by native control
- *  6. Improve some traces.
- *  7. Invalidate window rectangles after SetBandInfo, InsertBand, ShowBand
- *     so that repainting is correct.
- *  8. Implement RB_MAXIMIZEBAND for the "ideal=TRUE" case.
- *  9. Implement item custom draw notifications partially. Only done for
- *     ITEMPREPAINT and ITEMPOSTPAINT. (Used by IE4 for "Favorites" frame
- *     to draw the word "Favorites").
- * rev 8a
- * 10. Handle CCS_NODIVIDER and fix WS_BORDER code.
- * 11. Fix logic error in _AdjustBands where flag was set to valid band
- *     number (0) to indicate *no* band.
- * 12. Fix CCS_VERT errors in _ForceResize, _NCCalcSize, and _NCPaint.
- * 13. Support some special cases of CCS_TOP (and therefore CCS_LEFT),
- *     CCS_BOTTOM (and therefore CCS_RIGHT) and CCS_NOPARENTALIGN. Not
- *     at all sure whether this is all cases.
- * 14. Handle returned value for the RBN_CHILDSIZE notify.
- * 15. Implement RBBS_CHILDEDGE, and set each bands "offChild" at _Layout
- *     time.
- * 16. Fix REBARSPACE. It should depend on CCS_NODIVIDER.
- * rev 8b
- * 17. Fix determination of whether Gripper is needed in _ValidateBand.
- * 18. Fix _AdjustBand processing of RBBS_FIXEDSIZE.
- * rev 8c
- * 19. Fix problem in _Layout when all lengths are 0.
- * 20. If CLR_NONE specified, we will use default BtnFace color when drawing.
- * 21. Fix test in REBAR_Layout.
- * rev 8d
- * 22. Add support for WM_WINDOWPOSCHANGED to save new origin of window.
- * 23. Correct RBN_CHILDSIZE rect value for CCS_VERT rebar.
- * 24. Do UpdateWindow only if doing redraws.
- * rev 8e
- * 25. Adjust setting of offChild.cx based on RBBS_CHILDEDGE.
+ * TODO
+ *   Styles:
+ *   - RBS_DBLCLKTOGGLE
+ *   - RBS_FIXEDORDER
+ *   - RBS_REGISTERDROP
+ *   - RBS_TOOLTIPS
+ *   - CCS_NORESIZE
+ *   - CCS_NOMOVEX
+ *   - CCS_NOMOVEY
+ *   Messages:
+ *   - RB_BEGINDRAG
+ *   - RB_DRAGMOVE
+ *   - RB_ENDDRAG
+ *   - RB_GETBANDMARGINS
+ *   - RB_GETCOLORSCHEME
+ *   - RB_GETDROPTARGET
+ *   - RB_GETPALETTE
+ *   - RB_SETCOLORSCHEME
+ *   - RB_SETPALETTE
+ *   - RB_SETTOOLTIPS
+ *   - WM_CHARTOITEM
+ *   - WM_LBUTTONDBLCLK
+ *   - WM_MEASUREITEM
+ *   - WM_PALETTECHANGED
+ *   - WM_PRINTCLIENT
+ *   - WM_QUERYNEWPALETTE
+ *   - WM_RBUTTONDOWN
+ *   - WM_RBUTTONUP
+ *   - WM_SYSCOLORCHANGE
+ *   - WM_VKEYTOITEM
+ *   - WM_WININICHANGE
+ *   Notifications:
+ *   - NM_HCHITTEST
+ *   - NM_RELEASEDCAPTURE
+ *   - RBN_AUTOBREAK
+ *   - RBN_GETOBJECT
+ *   - RBN_MINMAX
+ *   Band styles:
+ *   - RBBS_FIXEDBMP
+ *   Native uses (on each draw!!) SM_CYBORDER (or SM_CXBORDER for CCS_VERT)
+ *   to set the size of the separator width (the value SEP_WIDTH_SIZE
+ *   in here). Should be fixed!!
+ */
+
+/*
+ * Testing: set to 1 to make background brush *always* green
+ */
+#define GLATESTING 0
+
+/*
  *
+ * 2.  At "FIXME:  problem # 2" WinRAR:
+ *   if "#if 1" then last band draws in separate row
+ *   if "#if 0" then last band draws in previous row *** just like native ***
  *
- *    Still to do:
- *  2. Following still not handled: RBBS_FIXEDBMP,
- *            CCS_NORESIZE,
- *            CCS_NOMOVEX, CCS_NOMOVEY
- *  3. Following are only partially handled:
- *            RBS_AUTOSIZE, RBBS_VARIABLEHEIGHT
- *  5. Native uses (on each draw!!) SM_CYBORDER (or SM_CXBORDER for CCS_VERT)
- *     to set the size of the separator width (the value SEP_WIDTH_SIZE
- *     in here). Should be fixed!!
- *  6. The following messages are not implemented:
- *        RB_BEGINDRAG, RB_DRAGMOVE, RB_ENDDRAG, RB_GETCOLORSCHEME,
- *        RB_GETDROPTARGET, RB_MAXIMIZEBAND,
- *        RB_SETCOLORSCHEME, RB_SETPALETTE, RB_SETTOOLTIPS
- *        WM_CHARTOITEM, WM_LBUTTONDBLCLK, WM_MEASUREITEM,
- *        WM_PALETTECHANGED, WM_PRINTCLIENT, WM_QUERYNEWPALETTE,
- *        WM_RBUTTONDOWN, WM_RBUTTONUP,
- *        WM_SYSCOLORCHANGE, WM_VKEYTOITEM, WM_WININICHANGE
- *  7. The following notifications are not implemented:
- *        NM_CUSTOMDRAW, NM_RELEASEDCAPTURE
- *        RBN_MINMAX
+ */
+#define PROBLEM2 0
+
+/*
+ * 3. REBAR_MoveChildWindows should have a loop because more than
+ *    one pass is made (together with the RBN_CHILDSIZEs) is made on
+ *    at least RB_INSERTBAND
  */
 
 #include <stdarg.h>
@@ -3131,9 +3081,9 @@
 	}
 
 	/* post copy */
-	if (uIndex < infoPtr->uNumBands - 1) {
+	if (uIndex < infoPtr->uNumBands) {
 	    memcpy (&infoPtr->bands[uIndex+1], &oldBands[uIndex],
-		    (infoPtr->uNumBands - uIndex - 1) * sizeof(REBAR_BAND));
+		    (infoPtr->uNumBands - uIndex) * sizeof(REBAR_BAND));
 	}
 
 	Free (oldBands);

reactos/lib/comctl32
string.c 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- string.c	16 Jun 2004 06:46:13 -0000	1.2
+++ string.c	20 Oct 2004 08:36:55 -0000	1.3
@@ -131,6 +131,16 @@
   return COMCTL32_ChrCmpHelperW(ch1, ch2, 0);
 }
 
+/*************************************************************************
+ * COMCTL32_ChrCmpIW
+ *
+ * Internal helper function.
+ */
+static BOOL COMCTL32_ChrCmpIW(WCHAR ch1, WCHAR ch2)
+{
+  return COMCTL32_ChrCmpHelperW(ch1, ch2, NORM_IGNORECASE);
+}
+
 /**************************************************************************
  * StrChrA [COMCTL32.350]
  *
@@ -627,7 +637,7 @@
 
   while (lpszStr <= lpszEnd  && *lpszStr)
   {
-    if (!COMCTL32_ChrCmpIA(*lpszSearch, *lpszStr))
+    if (!COMCTL32_ChrCmpIW(*lpszSearch, *lpszStr))
     {
       if (!StrCmpNIW(lpszStr, lpszSearch, iLen))
         lpszRet = (LPWSTR)lpszStr;

reactos/lib/comctl32
tab.c 1.10 -> 1.11
diff -u -r1.10 -r1.11
--- tab.c	19 Sep 2004 09:50:06 -0000	1.10
+++ tab.c	20 Oct 2004 08:36:55 -0000	1.11
@@ -113,6 +113,9 @@
 #define DEFAULT_TAB_WIDTH       96
 
 #define TAB_GetInfoPtr(hwnd) ((TAB_INFO *)GetWindowLongPtrW(hwnd,0))
+/* Since items are variable sized, cannot directly access them */
+#define TAB_GetItem(info,i) \
+  ((TAB_ITEM*)((LPBYTE)info->items + (i) * TAB_ITEM_SIZE(info)))
 
 /******************************************************************************
  * Hot-tracking timer constants
@@ -189,7 +192,7 @@
     if (TRACE_ON(tab)) {
 	TAB_ITEM *ti;
 
-	ti = &infoPtr->items[iItem];
+	ti = TAB_GetItem(infoPtr, iItem);
 	TRACE("tab %d, mask=0x%08x, dwState=0x%08lx, pszText=%s, iImage=%d\n",
 	      iItem, ti->mask, ti->dwState, debugstr_w(ti->pszText),
 	      ti->iImage);
@@ -323,7 +326,7 @@
     itemRect = &tmpItemRect;
 
   /* Retrieve the unmodified item rect. */
-  *itemRect = infoPtr->items[itemIndex].rect;
+  *itemRect = TAB_GetItem(infoPtr,itemIndex)->rect;
 
   /* calculate the times bottom and top based on the row */
   GetClientRect(hwnd, &clientRect);
@@ -361,7 +364,7 @@
   {
     OffsetRect(itemRect,
 	     0,
-	     -infoPtr->items[infoPtr->leftmostVisible].rect.top);
+	     -TAB_GetItem(infoPtr, infoPtr->leftmostVisible)->rect.top);
 
     /*
      * Move the rectangle so the first item is slightly offset from
@@ -374,7 +377,7 @@
   } else
   {
     OffsetRect(itemRect,
-	     -infoPtr->items[infoPtr->leftmostVisible].rect.left,
+	     -TAB_GetItem(infoPtr, infoPtr->leftmostVisible)->rect.left,
 	     0);
 
     /*
@@ -1014,11 +1017,11 @@
     {
        vsize = clientRect->right - (controlPos.right - controlPos.left + 1);
        maxRange = infoPtr->uNumItem;
-       tabwidth = infoPtr->items[maxRange - 1].rect.right;
+       tabwidth = TAB_GetItem(infoPtr, infoPtr->uNumItem - 1)->rect.right;
 
        for(; maxRange > 0; maxRange--)
        {
-          if(tabwidth - infoPtr->items[maxRange - 1].rect.left > vsize)
+          if(tabwidth - TAB_GetItem(infoPtr,maxRange - 1)->rect.left > vsize)
              break;
        }
 
@@ -1142,12 +1145,14 @@
 
   for (curItem = 0; curItem < infoPtr->uNumItem; curItem++)
   {
+    TAB_ITEM *curr = TAB_GetItem(infoPtr, curItem);
+	
     /* Set the leftmost position of the tab. */
-    infoPtr->items[curItem].rect.left = curItemLeftPos;
+    curr->rect.left = curItemLeftPos;
 
-    if ((lStyle & TCS_FIXEDWIDTH) || !infoPtr->items[curItem].pszText)
+    if ((lStyle & TCS_FIXEDWIDTH) || !curr->pszText)
     {
-      infoPtr->items[curItem].rect.right = infoPtr->items[curItem].rect.left +
+      curr->rect.right = curr->rect.left +
         max(infoPtr->tabWidth, icon_width);
     }
     else
@@ -1155,17 +1160,13 @@
       int num = 2;
 
       /* Calculate how wide the tab is depending on the text it contains */
-      GetTextExtentPoint32W(hdc, infoPtr->items[curItem].pszText,
-                            lstrlenW(infoPtr->items[curItem].pszText), &size);
+      GetTextExtentPoint32W(hdc, curr->pszText,
+                            lstrlenW(curr->pszText), &size);
 
-      infoPtr->items[curItem].rect.right = infoPtr->items[curItem].rect.left +
-                                           size.cx + icon_width +
-                                           num * infoPtr->uHItemPadding;
+      curr->rect.right = curr->rect.left + size.cx + icon_width +
+                         num * infoPtr->uHItemPadding;
       TRACE("for <%s>, l,r=%ld,%ld, num=%d\n",
-	  debugstr_w(infoPtr->items[curItem].pszText),
-	  infoPtr->items[curItem].rect.left,
-	  infoPtr->items[curItem].rect.right,
-	  num);
+	  debugstr_w(curr->pszText), curr->rect.left, curr->rect.right, num);
     }
 
     /*
@@ -1177,29 +1178,23 @@
      */
 
     if (((lStyle & TCS_MULTILINE) || (lStyle & TCS_VERTICAL)) &&
-        (infoPtr->items[curItem].rect.right > 
+        (curr->rect.right > 
 	(clientRect.right - CONTROL_BORDER_SIZEX - DISPLAY_AREA_PADDINGX)))
     {
-        infoPtr->items[curItem].rect.right -=
-                                      infoPtr->items[curItem].rect.left;
+        curr->rect.right -= curr->rect.left;
 
-	infoPtr->items[curItem].rect.left = 0;
+	curr->rect.left = 0;
         curItemRowCount++;
-	TRACE("wrapping <%s>, l,r=%ld,%ld\n",
-	    debugstr_w(infoPtr->items[curItem].pszText),
-	    infoPtr->items[curItem].rect.left,
-	    infoPtr->items[curItem].rect.right);
+	TRACE("wrapping <%s>, l,r=%ld,%ld\n", debugstr_w(curr->pszText),
+	    curr->rect.left, curr->rect.right);
     }
 
-    infoPtr->items[curItem].rect.bottom = 0;
-    infoPtr->items[curItem].rect.top = curItemRowCount - 1;
+    curr->rect.bottom = 0;
+    curr->rect.top = curItemRowCount - 1;
 
     TRACE("TextSize: %li\n", size.cx);
-    TRACE("Rect: T %li, L %li, B %li, R %li\n",
-	  infoPtr->items[curItem].rect.top,
-	  infoPtr->items[curItem].rect.left,
-	  infoPtr->items[curItem].rect.bottom,
-	  infoPtr->items[curItem].rect.right);
+    TRACE("Rect: T %li, L %li, B %li, R %li\n", curr->rect.top,
+	  curr->rect.left, curr->rect.bottom, curr->rect.right);
 
     /*
      * The leftmost position of the next item is the rightmost position
@@ -1207,12 +1202,12 @@
      */
     if (lStyle & TCS_BUTTONS)
     {
-      curItemLeftPos = infoPtr->items[curItem].rect.right + BUTTON_SPACINGX;
+      curItemLeftPos = curr->rect.right + BUTTON_SPACINGX;
       if (lStyle & TCS_FLATBUTTONS)
         curItemLeftPos += FLAT_BTN_SPACINGX;
     }
     else
-      curItemLeftPos = infoPtr->items[curItem].rect.right;
+      curItemLeftPos = curr->rect.right;
   }
 
   if (!((lStyle & TCS_MULTILINE) || (lStyle & TCS_VERTICAL)))
@@ -1260,15 +1255,14 @@
            iItm++,iCount++)
       {
           /* normalize the current rect */
-
+          TAB_ITEM *curr = TAB_GetItem(infoPtr, iItm);
+ 
           /* shift the item to the left side of the clientRect */
-          infoPtr->items[iItm].rect.right -=
-            infoPtr->items[iItm].rect.left;
-          infoPtr->items[iItm].rect.left = 0;
+          curr->rect.right -= curr->rect.left;
+          curr->rect.left = 0;
 
 	  TRACE("r=%ld, cl=%d, cl.r=%ld, iCount=%d, iRow=%d, uNumRows=%d, remTab=%d, tabPerRow=%d\n",
-	      infoPtr->items[iItm].rect.right,
-	      curItemLeftPos, clientRect.right,
+	      curr->rect.right, curItemLeftPos, clientRect.right,
 	      iCount, iRow, infoPtr->uNumRows, remTab, tabPerRow);
 
           /* if we have reached the maximum number of tabs on this row */
@@ -1292,23 +1286,21 @@
 	  }
 
           /* shift the item to the right to place it as the next item in this row */
-          infoPtr->items[iItm].rect.left += curItemLeftPos;
-          infoPtr->items[iItm].rect.right += curItemLeftPos;
-          infoPtr->items[iItm].rect.top = iRow;
+          curr->rect.left += curItemLeftPos;
+          curr->rect.right += curItemLeftPos;
+          curr->rect.top = iRow;
           if (lStyle & TCS_BUTTONS)
 	  {
-            curItemLeftPos = infoPtr->items[iItm].rect.right + 1;
+            curItemLeftPos = curr->rect.right + 1;
             if (lStyle & TCS_FLATBUTTONS)
 	      curItemLeftPos += FLAT_BTN_SPACINGX;
 	  }
           else
-            curItemLeftPos = infoPtr->items[iItm].rect.right;
+            curItemLeftPos = curr->rect.right;
 
 	  TRACE("arranging <%s>, l,r=%ld,%ld, row=%ld\n",
-	      debugstr_w(infoPtr->items[iItm].pszText),
-	      infoPtr->items[iItm].rect.left,
-	      infoPtr->items[iItm].rect.right,
-	      infoPtr->items[iItm].rect.top);
+	      debugstr_w(curr->pszText), curr->rect.left,
+	      curr->rect.right, curr->rect.top);
       }
 
       /*
@@ -1321,14 +1313,16 @@
 
         while(iIndexStart < infoPtr->uNumItem)
         {
+          TAB_ITEM *start = TAB_GetItem(infoPtr, iIndexStart);
+
           /*
-           * find the indexs of the row
+           * find the index of the row
            */
           /* find the first item on the next row */
           for (iIndexEnd=iIndexStart;
               (iIndexEnd < infoPtr->uNumItem) &&
- 	      (infoPtr->items[iIndexEnd].rect.top ==
-                infoPtr->items[iIndexStart].rect.top) ;
+ 	      (TAB_GetItem(infoPtr, iIndexEnd)->rect.top ==
+                start->rect.top) ;
               iIndexEnd++)
           /* intentionally blank */;
 
@@ -1339,7 +1333,7 @@
            */
           /* find the amount of space remaining on this row */
           widthDiff = clientRect.right - (2 * SELECTED_TAB_OFFSET) -
-			infoPtr->items[iIndexEnd - 1].rect.right;
+			TAB_GetItem(infoPtr, iIndexEnd - 1)->rect.right;
 
 	  /* iCount is the number of tab items on this row */
 	  iCount = iIndexEnd - iIndexStart;
@@ -1351,26 +1345,26 @@
 	    /* add widthDiff/iCount, or extra space/items on row, to each item on this row */
 	    for (iIndex=iIndexStart, iCount=0; iIndex < iIndexEnd; iIndex++, iCount++)
 	    {
-	      infoPtr->items[iIndex].rect.left += iCount * widthDiff;
-	      infoPtr->items[iIndex].rect.right += (iCount + 1) * widthDiff;
+              TAB_ITEM *item = TAB_GetItem(infoPtr, iIndex);
+
+	      item->rect.left += iCount * widthDiff;
+	      item->rect.right += (iCount + 1) * widthDiff;
 
 	      TRACE("adjusting 1 <%s>, l,r=%ld,%ld\n",
-		  debugstr_w(infoPtr->items[iIndex].pszText),
-		  infoPtr->items[iIndex].rect.left,
-		  infoPtr->items[iIndex].rect.right);
+		  debugstr_w(item->pszText),
+		  item->rect.left, item->rect.right);
 
 	    }
-	    infoPtr->items[iIndex - 1].rect.right += remainder;
+	    TAB_GetItem(infoPtr, iIndex - 1)->rect.right += remainder;
 	  }
 	  else /* we have only one item on this row, make it take up the entire row */
 	  {
-	    infoPtr->items[iIndexStart].rect.left = clientRect.left;
-	    infoPtr->items[iIndexStart].rect.right = clientRect.right - 4;
+	    start->rect.left = clientRect.left;
+	    start->rect.right = clientRect.right - 4;
 
 	    TRACE("adjusting 2 <%s>, l,r=%ld,%ld\n",
-		debugstr_w(infoPtr->items[iIndexStart].pszText),
-		infoPtr->items[iIndexStart].rect.left,
-		infoPtr->items[iIndexStart].rect.right);
+		debugstr_w(start->pszText),
+		start->rect.left, start->rect.right);
 
 	  }
 
@@ -1386,7 +1380,7 @@
     RECT rcOriginal;
     for(iIndex = 0; iIndex < infoPtr->uNumItem; iIndex++)
     {
-      rcItem = &(infoPtr->items[iIndex].rect);
+      rcItem = &TAB_GetItem(infoPtr, iIndex)->rect;
 
       rcOriginal = *rcItem;
 
@@ -1584,7 +1578,7 @@
 	}
 	else
 	{
-	  drawRect->bottom -= (infoPtr->items[iItem].rect.top != infoPtr->uNumRows-1)? 2:2;
+	  drawRect->bottom -= 2;
 	  InflateRect(drawRect, -2, 0);
 	}
       }
@@ -1626,7 +1620,7 @@
   */
   oldBkMode = SetBkMode(hdc, TRANSPARENT);
   SetTextColor(hdc, (((iItem == infoPtr->iHotTracked) && !(lStyle & TCS_FLATBUTTONS)) |
-		     (infoPtr->items[iItem].dwState & TCIS_HIGHLIGHTED)) ?
+		     (TAB_GetItem(infoPtr, iItem)->dwState & TCIS_HIGHLIGHTED)) ?
                      comctl32_color.clrHighlight : comctl32_color.clrBtnText);
 
   /*
@@ -1666,7 +1660,7 @@
     dis.hDC      = hdc;
     CopyRect(&dis.rcItem,drawRect);
     dis.itemData = 0;
-    memcpy( &dis.itemData, infoPtr->items[iItem].extra, min(sizeof(dis.itemData),infoPtr->cbInfo) );
+    memcpy( &dis.itemData, TAB_GetItem(infoPtr, iItem)->extra, min(sizeof(dis.itemData),infoPtr->cbInfo) );
 
     /*
      * send the draw message
@@ -1675,6 +1669,7 @@
   }
   else
   {
+    TAB_ITEM *item = TAB_GetItem(infoPtr, iItem);
     RECT rcTemp;
     RECT rcImage;
 
@@ -1690,17 +1685,16 @@
     rcText.left = rcText.top = rcText.right = rcText.bottom = 0;
 
     /* get the rectangle that the text fits in */
-    if (infoPtr->items[iItem].pszText)
+    if (item->pszText)
     {
-      DrawTextW(hdc, infoPtr->items[iItem].pszText, -1,
-                &rcText, DT_CALCRECT);
+      DrawTextW(hdc, item->pszText, -1, &rcText, DT_CALCRECT);
     }
     /*
      * If not owner draw, then do the drawing ourselves.
      *
      * Draw the icon.
      */
-    if (infoPtr->himl && (infoPtr->items[iItem].mask & TCIF_IMAGE))
+    if (infoPtr->himl && (item->mask & TCIF_IMAGE))
     {
       INT cx;
       INT cy;
@@ -1728,7 +1722,7 @@
         center_offset_v = 0;
 	
       TRACE("for <%s>, c_o_h=%d, c_o_v=%d, draw=(%ld,%ld)-(%ld,%ld), textlen=%ld\n",
-	  debugstr_w(infoPtr->items[iItem].pszText), center_offset_h, center_offset_v,
+	  debugstr_w(item->pszText), center_offset_h, center_offset_v,
 	  drawRect->left, drawRect->top, drawRect->right, drawRect->bottom,
 	  (rcText.right-rcText.left));
 
@@ -1755,11 +1749,11 @@
       }
 
       TRACE("drawing image=%d, left=%ld, top=%ld\n",
-	    infoPtr->items[iItem].iImage, rcImage.left, rcImage.top-1);
+	    item->iImage, rcImage.left, rcImage.top-1);
       ImageList_Draw
         (
         infoPtr->himl,
-        infoPtr->items[iItem].iImage,
+        item->iImage,
         hdc,
         rcImage.left,
         rcImage.top,
@@ -1835,15 +1829,15 @@
       hFont = CreateFontIndirectA(&logfont);
       SelectObject(hdc, hFont);
 
-      if (infoPtr->items[iItem].pszText)
+      if (item->pszText)
       {
         ExtTextOutW(hdc,
         (lStyle & TCS_BOTTOM) ? drawRect->right : drawRect->left,
         (!(lStyle & TCS_BOTTOM)) ? drawRect->bottom : drawRect->top,
         ETO_CLIPPED,
         drawRect,
-        infoPtr->items[iItem].pszText,
-        lstrlenW(infoPtr->items[iItem].pszText),
+        item->pszText,
+        lstrlenW(item->pszText),
         0);
       }
 
@@ -1852,16 +1846,16 @@
     else
     {
       TRACE("for <%s>, c_o_h=%d, c_o_v=%d, draw=(%ld,%ld)-(%ld,%ld), textlen=%ld\n",
-	  debugstr_w(infoPtr->items[iItem].pszText), center_offset_h, center_offset_v,
+	  debugstr_w(item->pszText), center_offset_h, center_offset_v,
 	  drawRect->left, drawRect->top, drawRect->right, drawRect->bottom,
 	  (rcText.right-rcText.left));
-      if (infoPtr->items[iItem].pszText)
+      if (item->pszText)
       {
         DrawTextW
         (
           hdc,
-          infoPtr->items[iItem].pszText,
-          lstrlenW(infoPtr->items[iItem].pszText),
+          item->pszText,
+          lstrlenW(item->pszText),
           drawRect,
           DT_LEFT | DT_SINGLELINE
         );
@@ -2086,7 +2080,7 @@
         if (lStyle & TCS_BOTTOM)
         {
 	  /* Adjust both rectangles for topmost row */
-	  if (infoPtr->items[iItem].rect.top == infoPtr->uNumRows-1)
+	  if (TAB_GetItem(infoPtr, iItem)->rect.top == infoPtr->uNumRows-1)
 	  {
 	    fillRect.top -= 2;
 	    r.top -= 1;
@@ -2140,7 +2134,7 @@
         else
         {
 	  /* Adjust both rectangles for bottommost row */
-	  if (infoPtr->items[iItem].rect.top == infoPtr->uNumRows-1)
+	  if (TAB_GetItem(infoPtr, iItem)->rect.top == infoPtr->uNumRows-1)
 	  {
 	    fillRect.bottom += 3;
 	    r.bottom += 2;
@@ -2304,13 +2298,14 @@
    * style */
   if ((infoPtr->uNumRows > 1) && !(lStyle & TCS_BUTTONS))
   {
+      TAB_ITEM *selected = TAB_GetItem(infoPtr, iSelected);
       INT newselected;
       INT iTargetRow;
 
       if(lStyle & TCS_VERTICAL)
-        newselected = infoPtr->items[iSelected].rect.left;
+        newselected = selected->rect.left;
       else
-        newselected = infoPtr->items[iSelected].rect.top;
+        newselected = selected->rect.top;
 
       /* the target row is always (number of rows - 1)
          as row 0 is furthest from the clientRect */
@@ -2324,12 +2319,14 @@
            for (i=0; i < infoPtr->uNumItem; i++)
            {
              /* move everything in the row of the selected item to the iTargetRow */
-             if (infoPtr->items[i].rect.left == newselected )
-                 infoPtr->items[i].rect.left = iTargetRow;
+             TAB_ITEM *item = TAB_GetItem(infoPtr, i);
+
+             if (item->rect.left == newselected )
+                 item->rect.left = iTargetRow;
              else
              {
-               if (infoPtr->items[i].rect.left > newselected)
-                 infoPtr->items[i].rect.left-=1;
+               if (item->rect.left > newselected)
+                 item->rect.left-=1;
              }
            }
          }
@@ -2337,12 +2334,14 @@
          {
            for (i=0; i < infoPtr->uNumItem; i++)
            {
-             if (infoPtr->items[i].rect.top == newselected )
-                 infoPtr->items[i].rect.top = iTargetRow;
+             TAB_ITEM *item = TAB_GetItem(infoPtr, i);
+
+             if (item->rect.top == newselected )
+                 item->rect.top = iTargetRow;
              else
              {
-               if (infoPtr->items[i].rect.top > newselected)
-                 infoPtr->items[i].rect.top-=1;
+               if (item->rect.top > newselected)
+                 item->rect.top-=1;
              }
           }
         }
@@ -2363,6 +2362,7 @@
   }
   else
   {
+     TAB_ITEM *selected = TAB_GetItem(infoPtr, iSelected);
      RECT r;
      INT width;
      UINT i;
@@ -2374,8 +2374,8 @@
      GetClientRect(infoPtr->hwndUpDown, &r);
      width -= r.right;
 
-     if ((infoPtr->items[iSelected].rect.right -
-          infoPtr->items[iSelected].rect.left) >= width )
+     if ((selected->rect.right -
+          selected->rect.left) >= width )
      {
         /* Special case: width of selected item is greater than visible
          * part of control.
@@ -2386,8 +2386,7 @@
      {
         for (i = infoPtr->leftmostVisible; i < infoPtr->uNumItem; i++)
         {
-           if ((infoPtr->items[iSelected].rect.right -
-                infoPtr->items[i].rect.left) < width)
+           if ((selected->rect.right - TAB_GetItem(infoPtr, i)->rect.left) < width)
               break;
         }
         infoPtr->leftmostVisible = i;
@@ -2493,9 +2492,10 @@
 }
 
 static LRESULT
-TAB_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TAB_InsertItemAW (HWND hwnd, WPARAM wParam, LPARAM lParam, BOOL bUnicode)
 {
   TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
+  TAB_ITEM *item;
   TCITEMA *pti;
   INT iItem;
   RECT rect;
@@ -2511,7 +2511,10 @@
   if (iItem > infoPtr->uNumItem)
     iItem = infoPtr->uNumItem;
 
-  TAB_DumpItemExternalA(pti, iItem);
+  if (bUnicode)
+    TAB_DumpItemExternalW((TCITEMW*)pti, iItem);
+  else
+    TAB_DumpItemExternalA(pti, iItem);
 
 
   if (infoPtr->uNumItem == 0) {
@@ -2520,20 +2523,21 @@
     infoPtr->iSelected = 0;
   }
   else {
-    TAB_ITEM *oldItems = infoPtr->items;
+    LPBYTE oldItems = (LPBYTE)infoPtr->items;
 
     infoPtr->uNumItem++;
     infoPtr->items = Alloc (TAB_ITEM_SIZE(infoPtr) * infoPtr->uNumItem);
 
     /* pre insert copy */
     if (iItem > 0) {
-      memcpy (&infoPtr->items[0], &oldItems[0],
+      memcpy (infoPtr->items, oldItems,
               iItem * TAB_ITEM_SIZE(infoPtr));
     }
 
     /* post insert copy */
     if (iItem < infoPtr->uNumItem - 1) {
-      memcpy (&infoPtr->items[iItem+1], &oldItems[iItem],
+      memcpy (TAB_GetItem(infoPtr, iItem + 1),
+              oldItems + iItem * TAB_ITEM_SIZE(infoPtr),
               (infoPtr->uNumItem - iItem - 1) * TAB_ITEM_SIZE(infoPtr));
 
     }
@@ -2544,94 +2548,29 @@
     Free (oldItems);
   }
 
-  infoPtr->items[iItem].mask = pti->mask;
-  if (pti->mask & TCIF_TEXT)
-    Str_SetPtrAtoW (&infoPtr->items[iItem].pszText, pti->pszText);
-
-  if (pti->mask & TCIF_IMAGE)
-    infoPtr->items[iItem].iImage = pti->iImage;
-
-  if (pti->mask & TCIF_PARAM)
-    memcpy(infoPtr->items[iItem].extra, &pti->lParam, infoPtr->cbInfo);
-  else
-    memset(infoPtr->items[iItem].extra, 0, infoPtr->cbInfo);
-  
-  TAB_SetItemBounds(hwnd);
-  if (infoPtr->uNumItem > 1)
-    TAB_InvalidateTabArea(hwnd, infoPtr);
-  else
-    InvalidateRect(hwnd, NULL, TRUE);
-
-  TRACE("[%p]: added item %d %s\n",
-        hwnd, iItem, debugstr_w(infoPtr->items[iItem].pszText));
-
-  return iItem;
-}
-
-
-static LRESULT
-TAB_InsertItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
-{
-  TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
-  TCITEMW *pti;
-  INT iItem;
-  RECT rect;
-
-  GetClientRect (hwnd, &rect);
-  TRACE("Rect: %p T %li, L %li, B %li, R %li\n", hwnd,
-        rect.top, rect.left, rect.bottom, rect.right);
-
-  pti = (TCITEMW *)lParam;
-  iItem = (INT)wParam;
-
-  if (iItem < 0) return -1;
-  if (iItem > infoPtr->uNumItem)
-    iItem = infoPtr->uNumItem;
-
-  TAB_DumpItemExternalW(pti, iItem);
-
-  if (infoPtr->uNumItem == 0) {
-    infoPtr->items = Alloc (TAB_ITEM_SIZE(infoPtr));
-    infoPtr->uNumItem++;
-    infoPtr->iSelected = 0;
-  }
-  else {
-    TAB_ITEM *oldItems = infoPtr->items;
-
-    infoPtr->uNumItem++;
-    infoPtr->items = Alloc (TAB_ITEM_SIZE(infoPtr) * infoPtr->uNumItem);
-
-    /* pre insert copy */
-    if (iItem > 0) {
-      memcpy (&infoPtr->items[0], &oldItems[0],
-              iItem * TAB_ITEM_SIZE(infoPtr));
-    }
-
-    /* post insert copy */
-    if (iItem < infoPtr->uNumItem - 1) {
-      memcpy (&infoPtr->items[iItem+1], &oldItems[iItem],
-              (infoPtr->uNumItem - iItem - 1) * TAB_ITEM_SIZE(infoPtr));
-
-  }
-
-    if (iItem <= infoPtr->iSelected)
-      infoPtr->iSelected++;
+  item = TAB_GetItem(infoPtr, iItem);
 
-    Free (oldItems);
-  }
+  item->mask = pti->mask;
+  item->pszText = NULL;
 
-  infoPtr->items[iItem].mask = pti->mask;
   if (pti->mask & TCIF_TEXT)
-    Str_SetPtrW (&infoPtr->items[iItem].pszText, pti->pszText);
+  {
+    if (bUnicode)
+      Str_SetPtrW (&item->pszText, (WCHAR*)pti->pszText);
+    else
+      Str_SetPtrAtoW (&item->pszText, pti->pszText);
+  }
 
   if (pti->mask & TCIF_IMAGE)
-    infoPtr->items[iItem].iImage = pti->iImage;
+    item->iImage = pti->iImage;
+  else
+    item->iImage = -1;
 
   if (pti->mask & TCIF_PARAM)
-    memcpy(infoPtr->items[iItem].extra, &pti->lParam, infoPtr->cbInfo);
+    memcpy(item->extra, &pti->lParam, infoPtr->cbInfo);
   else
-    memset(infoPtr->items[iItem].extra, 0, infoPtr->cbInfo);
-
+    memset(item->extra, 0, infoPtr->cbInfo);
+  
   TAB_SetItemBounds(hwnd);
   if (infoPtr->uNumItem > 1)
     TAB_InvalidateTabArea(hwnd, infoPtr);
@@ -2639,12 +2578,11 @@
     InvalidateRect(hwnd, NULL, TRUE);
 
   TRACE("[%p]: added item %d %s\n",
-        hwnd, iItem, debugstr_w(infoPtr->items[iItem].pszText));
+        hwnd, iItem, debugstr_w(item->pszText));
 
   return iItem;
 }
 
-
 static LRESULT
 TAB_SetItemSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
@@ -2707,9 +2645,9 @@
 
   if ((infoPtr) && (iItem>=0) && (iItem<infoPtr->uNumItem)) {
     if (fHighlight)
-      infoPtr->items[iItem].dwState |= TCIS_HIGHLIGHTED;
+      TAB_GetItem(infoPtr, iItem)->dwState |= TCIS_HIGHLIGHTED;
     else
-      infoPtr->items[iItem].dwState &= ~TCIS_HIGHLIGHTED;
+      TAB_GetItem(infoPtr, iItem)->dwState &= ~TCIS_HIGHLIGHTED;
   } else
     return FALSE;
 
@@ -2717,7 +2655,7 @@
 }
 
 static LRESULT
-TAB_SetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TAB_SetItemAW (HWND hwnd, WPARAM wParam, LPARAM lParam, BOOL bUnicode)
 {
   TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
   TCITEMA *tabItem;
@@ -2730,9 +2668,12 @@
   TRACE("%d %p\n", iItem, tabItem);
   if ((iItem<0) || (iItem>=infoPtr->uNumItem)) return FALSE;
 
-  TAB_DumpItemExternalA(tabItem, iItem);
+  if (bUnicode)
+    TAB_DumpItemExternalW((TCITEMW *)tabItem, iItem);
+  else
+    TAB_DumpItemExternalA(tabItem, iItem);
 
-  wineItem = &infoPtr->items[iItem];
+  wineItem = TAB_GetItem(infoPtr, iItem);
 
   if (tabItem->mask & TCIF_IMAGE)
     wineItem->iImage = tabItem->iImage;
@@ -2747,49 +2688,18 @@
     wineItem->dwState = tabItem->dwState;
 
   if (tabItem->mask & TCIF_TEXT)
-   Str_SetPtrAtoW(&wineItem->pszText, tabItem->pszText);
-
-  /* Update and repaint tabs */
-  TAB_SetItemBounds(hwnd);
-  TAB_InvalidateTabArea(hwnd,infoPtr);
-
-  return TRUE;
+  {
+    if (wineItem->pszText)
+    {
+      Free(wineItem->pszText);
+      wineItem->pszText = NULL;
+    }
+    if (bUnicode)
+      Str_SetPtrW(&wineItem->pszText, (WCHAR*)tabItem->pszText);
+    else
+      Str_SetPtrAtoW(&wineItem->pszText, tabItem->pszText);
   }
 
-
-static LRESULT
-TAB_SetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
-{
-  TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
-  TCITEMW *tabItem;
-  TAB_ITEM *wineItem;
-  INT    iItem;
-
-  iItem = (INT)wParam;
-  tabItem = (LPTCITEMW)lParam;
-
-  TRACE("%d %p\n", iItem, tabItem);
-  if ((iItem<0) || (iItem>=infoPtr->uNumItem)) return FALSE;
-
-  TAB_DumpItemExternalW(tabItem, iItem);
-
-  wineItem = &infoPtr->items[iItem];
-
-  if (tabItem->mask & TCIF_IMAGE)
-    wineItem->iImage = tabItem->iImage;
-
-  if (tabItem->mask & TCIF_PARAM)
-    memcpy(wineItem->extra, &tabItem->lParam, infoPtr->cbInfo);
-
-  if (tabItem->mask & TCIF_RTLREADING)
-    FIXME("TCIF_RTLREADING\n");
-
-  if (tabItem->mask & TCIF_STATE)
-    wineItem->dwState = tabItem->dwState;
-
-  if (tabItem->mask & TCIF_TEXT)
-   Str_SetPtrW(&wineItem->pszText, tabItem->pszText);
-
   /* Update and repaint tabs */
   TAB_SetItemBounds(hwnd);
   TAB_InvalidateTabArea(hwnd,infoPtr);
@@ -2797,7 +2707,6 @@
   return TRUE;
 }
 
-
 static LRESULT
 TAB_GetItemCount (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
@@ -2808,7 +2717,7 @@
 
 
 static LRESULT
-TAB_GetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TAB_GetItemAW (HWND hwnd, WPARAM wParam, LPARAM lParam, BOOL bUnicode)
 {
    TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
    TCITEMA *tabItem;
@@ -2821,44 +2730,7 @@
   if ((iItem<0) || (iItem>=infoPtr->uNumItem))
     return FALSE;
 
-  wineItem = &infoPtr->items[iItem];
-
-  if (tabItem->mask & TCIF_IMAGE)
-    tabItem->iImage = wineItem->iImage;
-
-  if (tabItem->mask & TCIF_PARAM)
-    memcpy(&tabItem->lParam, wineItem->extra, infoPtr->cbInfo);
-
-  if (tabItem->mask & TCIF_RTLREADING)
-    FIXME("TCIF_RTLREADING\n");
-
-  if (tabItem->mask & TCIF_STATE)
-    tabItem->dwState = wineItem->dwState;
-
-  if (tabItem->mask & TCIF_TEXT)
-   Str_GetPtrWtoA (wineItem->pszText, tabItem->pszText, tabItem->cchTextMax);
-
-  TAB_DumpItemExternalA(tabItem, iItem);
-
-  return TRUE;
-}
-
-
-static LRESULT
-TAB_GetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
-{
-  TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
-  TCITEMW *tabItem;
-  TAB_ITEM *wineItem;
-  INT    iItem;
-
-  iItem = (INT)wParam;
-  tabItem = (LPTCITEMW)lParam;
-  TRACE("\n");
-  if ((iItem<0) || (iItem>=infoPtr->uNumItem))
-    return FALSE;
-
-  wineItem=& infoPtr->items[iItem];
+  wineItem = TAB_GetItem(infoPtr, iItem);
 
   if (tabItem->mask & TCIF_IMAGE)
     tabItem->iImage = wineItem->iImage;
@@ -2873,9 +2745,17 @@
     tabItem->dwState = wineItem->dwState;
 
   if (tabItem->mask & TCIF_TEXT)
-   Str_GetPtrW (wineItem->pszText, tabItem->pszText, tabItem->cchTextMax);
+  {
+    if (bUnicode)
+      Str_GetPtrW (wineItem->pszText, (WCHAR*)tabItem->pszText, tabItem->cchTextMax);
+    else
+      Str_GetPtrWtoA (wineItem->pszText, tabItem->pszText, tabItem->cchTextMax);
+  }
 
-  TAB_DumpItemExternalW(tabItem, iItem);
+  if (bUnicode)
+    TAB_DumpItemExternalW((TCITEMW*)tabItem, iItem);
+  else
+    TAB_DumpItemExternalA(tabItem, iItem);
 
   return TRUE;
 }
@@ -2890,20 +2770,43 @@
 
     if ((iItem >= 0) && (iItem < infoPtr->uNumItem))
     {
-	TAB_ITEM *oldItems = infoPtr->items;
+        TAB_ITEM *item = TAB_GetItem(infoPtr, iItem);
+        LPBYTE oldItems = (LPBYTE)infoPtr->items;
 	
 	TAB_InvalidateTabArea(hwnd, infoPtr);
 
+	if ((item->mask & TCIF_TEXT) && item->pszText)
+            Free(item->pszText);
+
 	infoPtr->uNumItem--;
-	infoPtr->items = Alloc(TAB_ITEM_SIZE(infoPtr) * infoPtr->uNumItem);
 
-	if (iItem > 0)
-	    memcpy(&infoPtr->items[0], &oldItems[0], iItem * TAB_ITEM_SIZE(infoPtr));
+	if (!infoPtr->uNumItem)
+        {
+            infoPtr->items = NULL;
+            if (infoPtr->iHotTracked >= 0)
+            {
+                KillTimer(hwnd, TAB_HOTTRACK_TIMER);
+                infoPtr->iHotTracked = -1;
+            }
+        }
+        else
+	{
+	    infoPtr->items = Alloc(TAB_ITEM_SIZE(infoPtr) * infoPtr->uNumItem);
 
-	if (iItem < infoPtr->uNumItem)
-	    memcpy(&infoPtr->items[iItem], &oldItems[iItem + 1],
-		   (infoPtr->uNumItem - iItem) * TAB_ITEM_SIZE(infoPtr));
+	    if (iItem > 0)
+	        memcpy(infoPtr->items, oldItems, iItem * TAB_ITEM_SIZE(infoPtr));
 
+	    if (iItem < infoPtr->uNumItem)
+	        memcpy(TAB_GetItem(infoPtr, iItem),
+                       oldItems + (iItem + 1) * TAB_ITEM_SIZE(infoPtr),
+		       (infoPtr->uNumItem - iItem) * TAB_ITEM_SIZE(infoPtr));
+
+            if (iItem <= infoPtr->iHotTracked)
+            {
+                /* When tabs move left/up, the hot track item may change */
+                FIXME("Recalc hot track");
+            }
+	}
 	Free(oldItems);
 
 	/* Readjust the selected index */
@@ -2929,17 +2832,9 @@
 TAB_DeleteAllItems (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
     TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
-   
-    TAB_InvalidateTabArea(hwnd,infoPtr);  
-
-    Free (infoPtr->items);
-    infoPtr->uNumItem = 0;
-    infoPtr->iSelected = -1;
-    if (infoPtr->iHotTracked >= 0)
-	KillTimer(hwnd, TAB_HOTTRACK_TIMER);
-    infoPtr->iHotTracked = -1;
-    
-    TAB_SetItemBounds(hwnd);
+ 
+    while (infoPtr->uNumItem)
+      TAB_DeleteItem (hwnd, 0, 0);
     return TRUE;
 }
 
@@ -3154,8 +3049,8 @@
 
   if (infoPtr->items) {
     for (iItem = 0; iItem < infoPtr->uNumItem; iItem++) {
-      if (infoPtr->items[iItem].pszText)
-	Free (infoPtr->items[iItem].pszText);
+      if (TAB_GetItem(infoPtr, iItem)->pszText)
+	Free (TAB_GetItem(infoPtr, iItem)->pszText);
     }
     Free (infoPtr->items);
   }
@@ -3214,16 +3109,12 @@
       return TAB_GetItemCount (hwnd, wParam, lParam);
 
     case TCM_GETITEMA:
-      return TAB_GetItemA (hwnd, wParam, lParam);
-
     case TCM_GETITEMW:
-      return TAB_GetItemW (hwnd, wParam, lParam);
+      return TAB_GetItemAW (hwnd, wParam, lParam, uMsg == TCM_GETITEMW);
 
     case TCM_SETITEMA:
-      return TAB_SetItemA (hwnd, wParam, lParam);
-
     case TCM_SETITEMW:
-      return TAB_SetItemW (hwnd, wParam, lParam);
+      return TAB_SetItemAW (hwnd, wParam, lParam, uMsg == TCM_SETITEMW);
 
     case TCM_DELETEITEM:
       return TAB_DeleteItem (hwnd, wParam, lParam);
@@ -3244,10 +3135,8 @@
       return TAB_SetCurSel (hwnd, wParam);
 
     case TCM_INSERTITEMA:
-      return TAB_InsertItemA (hwnd, wParam, lParam);
-
     case TCM_INSERTITEMW:
-      return TAB_InsertItemW (hwnd, wParam, lParam);
+      return TAB_InsertItemAW (hwnd, wParam, lParam, uMsg == TCM_INSERTITEMW);
 
     case TCM_SETITEMEXTRA:
       return TAB_SetItemExtra (hwnd, wParam, lParam);

reactos/lib/comctl32
toolbar.c 1.19 -> 1.20
diff -u -r1.19 -r1.20
--- toolbar.c	19 Sep 2004 09:50:06 -0000	1.19
+++ toolbar.c	20 Oct 2004 08:36:55 -0000	1.20
@@ -45,6 +45,7 @@
  *     - TB_GETMETRICS
  *     - TB_GETOBJECT
  *     - TB_INSERTMARKHITTEST
+ *     - TB_SAVERESTORE
  *     - TB_SETMETRICS
  *   - Notifications:
  *     - NM_CHAR
@@ -1570,14 +1571,14 @@
 	/* Set the toolTip only for non-hidden, non-separator button */
 	if (infoPtr->hwndToolTip && !(btnPtr->fsStyle & BTNS_SEP ))
 	{
-	    TTTOOLINFOA ti;
+	    TTTOOLINFOW ti;
 
-	    ZeroMemory (&ti, sizeof(TTTOOLINFOA));
-	    ti.cbSize = sizeof(TTTOOLINFOA);
+	    ZeroMemory (&ti, sizeof(ti));
+	    ti.cbSize = sizeof(ti);
 	    ti.hwnd = hwnd;
 	    ti.uId = btnPtr->idCommand;
 	    ti.rect = btnPtr->rect;
-	    SendMessageA (infoPtr->hwndToolTip, TTM_NEWTOOLRECTA,
+	    SendMessageW (infoPtr->hwndToolTip, TTM_NEWTOOLRECTW,
 			    0, (LPARAM)&ti);
 	}
 
@@ -1760,7 +1761,7 @@
     msg.pt.x = LOWORD(GetMessagePos ());
     msg.pt.y = HIWORD(GetMessagePos ());
 
-    SendMessageA (hwndTip, TTM_RELAYEVENT, 0, (LPARAM)&msg);
+    SendMessageW (hwndTip, TTM_RELAYEVENT, 0, (LPARAM)&msg);
 }
 
 /* keeps available button list box sorted by button id */
@@ -1771,50 +1772,51 @@
     PCUSTOMBUTTON btnInfo;
     HWND hwndAvail = GetDlgItem(hwnd, IDC_AVAILBTN_LBOX);
 
-    ERR("button %s, idCommand %d\n", debugstr_w(btnInfoNew->text), btnInfoNew->btn.idCommand);
+    TRACE("button %s, idCommand %d\n", debugstr_w(btnInfoNew->text), btnInfoNew->btn.idCommand);
 
-    count = SendMessageA(hwndAvail, LB_GETCOUNT, 0, 0);
+    count = SendMessageW(hwndAvail, LB_GETCOUNT, 0, 0);
 
     /* position 0 is always separator */
     for (i = 1; i < count; i++)
     {
-        btnInfo = (PCUSTOMBUTTON)SendMessageA(hwndAvail, LB_GETITEMDATA, i, 0);
+        btnInfo = (PCUSTOMBUTTON)SendMessageW(hwndAvail, LB_GETITEMDATA, i, 0);
         if (btnInfoNew->btn.idCommand < btnInfo->btn.idCommand)
         {
-            i = SendMessageA(hwndAvail, LB_INSERTSTRING, i, 0);
-            SendMessageA(hwndAvail, LB_SETITEMDATA, i, (LPARAM)btnInfoNew);
+            i = SendMessageW(hwndAvail, LB_INSERTSTRING, i, 0);
+            SendMessageW(hwndAvail, LB_SETITEMDATA, i, (LPARAM)btnInfoNew);
             return;
         }
     }
     /* id higher than all others add to end */
-    i = SendMessageA(hwndAvail, LB_ADDSTRING, 0, 0);
-    SendMessageA(hwndAvail, LB_SETITEMDATA, i, (LPARAM)btnInfoNew);
+    i = SendMessageW(hwndAvail, LB_ADDSTRING, 0, 0);
+    SendMessageW(hwndAvail, LB_SETITEMDATA, i, (LPARAM)btnInfoNew);
 }
 
 static void TOOLBAR_Cust_MoveButton(PCUSTDLG_INFO custInfo, HWND hwnd, INT nIndexFrom, INT nIndexTo)
 {
-    NMTOOLBARA nmtb;
+    NMTOOLBARW nmtb;
 
 	TRACE("index from %d, index to %d\n", nIndexFrom, nIndexTo);
 
     if (nIndexFrom == nIndexTo)
         return;
 
-    /* send TBN_QUERYINSERT notification */
-    nmtb.iItem = nIndexFrom; /* FIXME: this doesn't look right */
+    /* MSDN states that iItem is the index of the button, rather than the
+     * command ID as used by every other NMTOOLBAR notification */
+    nmtb.iItem = nIndexFrom;
     if (TOOLBAR_SendNotify((NMHDR *)&nmtb, custInfo->tbInfo, TBN_QUERYINSERT))
     {
         PCUSTOMBUTTON btnInfo;
         NMHDR hdr;
         HWND hwndList = GetDlgItem(hwnd, IDC_TOOLBARBTN_LBOX);
-        int count = SendMessageA(hwndList, LB_GETCOUNT, 0, 0);
+        int count = SendMessageW(hwndList, LB_GETCOUNT, 0, 0);
 
-        btnInfo = (PCUSTOMBUTTON)SendMessageA(hwndList, LB_GETITEMDATA, nIndexFrom, 0);
+        btnInfo = (PCUSTOMBUTTON)SendMessageW(hwndList, LB_GETITEMDATA, nIndexFrom, 0);
 
-        SendMessageA(hwndList, LB_DELETESTRING, nIndexFrom, 0);
-        SendMessageA(hwndList, LB_INSERTSTRING, nIndexTo, 0);
-        SendMessageA(hwndList, LB_SETITEMDATA, nIndexTo, (LPARAM)btnInfo);
-        SendMessageA(hwndList, LB_SETCURSEL, nIndexTo, 0);
+        SendMessageW(hwndList, LB_DELETESTRING, nIndexFrom, 0);
+        SendMessageW(hwndList, LB_INSERTSTRING, nIndexTo, 0);
+        SendMessageW(hwndList, LB_SETITEMDATA, nIndexTo, (LPARAM)btnInfo);
+        SendMessageW(hwndList, LB_SETCURSEL, nIndexTo, 0);
 
         if (nIndexTo <= 0)
             EnableWindow(GetDlgItem(hwnd,IDC_MOVEUP_BTN), FALSE);
@@ -1827,8 +1829,8 @@
         else
             EnableWindow(GetDlgItem(hwnd,IDC_MOVEDN_BTN), TRUE);
 
-        SendMessageA(custInfo->tbHwnd, TB_DELETEBUTTON, nIndexFrom, 0);
-        SendMessageA(custInfo->tbHwnd, TB_INSERTBUTTONA, nIndexTo, (LPARAM)&(btnInfo->btn));
+        SendMessageW(custInfo->tbHwnd, TB_DELETEBUTTON, nIndexFrom, 0);
+        SendMessageW(custInfo->tbHwnd, TB_INSERTBUTTONW, nIndexTo, (LPARAM)&(btnInfo->btn));
 
         TOOLBAR_SendNotify(&hdr, custInfo->tbInfo, TBN_TOOLBARCHANGE);
     }
@@ -1836,30 +1838,31 @@
 
 static void TOOLBAR_Cust_AddButton(PCUSTDLG_INFO custInfo, HWND hwnd, INT nIndexAvail, INT nIndexTo)
 {
-    NMTOOLBARA nmtb;
+    NMTOOLBARW nmtb;
 
     TRACE("Add: nIndexAvail %d, nIndexTo %d\n", nIndexAvail, nIndexTo);
 
-    /* send TBN_QUERYINSERT notification */
-    nmtb.iItem = nIndexAvail; /* FIXME: this doesn't look right */
+    /* MSDN states that iItem is the index of the button, rather than the
+     * command ID as used by every other NMTOOLBAR notification */
+    nmtb.iItem = nIndexAvail;
     if (TOOLBAR_SendNotify((NMHDR *)&nmtb, custInfo->tbInfo, TBN_QUERYINSERT))
     {
         PCUSTOMBUTTON btnInfo;
         NMHDR hdr;
         HWND hwndList = GetDlgItem(hwnd, IDC_TOOLBARBTN_LBOX);
         HWND hwndAvail = GetDlgItem(hwnd, IDC_AVAILBTN_LBOX);
-        int count = SendMessageA(hwndAvail, LB_GETCOUNT, 0, 0);
+        int count = SendMessageW(hwndAvail, LB_GETCOUNT, 0, 0);
 
-        btnInfo = (PCUSTOMBUTTON)SendMessageA(hwndAvail, LB_GETITEMDATA, nIndexAvail, 0);
+        btnInfo = (PCUSTOMBUTTON)SendMessageW(hwndAvail, LB_GETITEMDATA, nIndexAvail, 0);
 
         if (nIndexAvail != 0) /* index == 0 indicates separator */
         {
             /* remove from 'available buttons' list */
-            SendMessageA(hwndAvail, LB_DELETESTRING, nIndexAvail, 0);
+            SendMessageW(hwndAvail, LB_DELETESTRING, nIndexAvail, 0);
             if (nIndexAvail == count-1)
-                SendMessageA(hwndAvail, LB_SETCURSEL, nIndexAvail-1 , 0);
+                SendMessageW(hwndAvail, LB_SETCURSEL, nIndexAvail-1 , 0);
             else
-                SendMessageA(hwndAvail, LB_SETCURSEL, nIndexAvail , 0);
+                SendMessageW(hwndAvail, LB_SETCURSEL, nIndexAvail , 0);
         }
         else
         {
@@ -1872,10 +1875,10 @@
         }
 
         /* insert into 'toolbar button' list */
-        SendMessageA(hwndList, LB_INSERTSTRING, nIndexTo, 0);
-        SendMessageA(hwndList, LB_SETITEMDATA, nIndexTo, (LPARAM)btnInfo);
+        SendMessageW(hwndList, LB_INSERTSTRING, nIndexTo, 0);
+        SendMessageW(hwndList, LB_SETITEMDATA, nIndexTo, (LPARAM)btnInfo);
 
-        SendMessageA(custInfo->tbHwnd, TB_INSERTBUTTONA, nIndexTo, (LPARAM)&(btnInfo->btn));
+        SendMessageW(custInfo->tbHwnd, TB_INSERTBUTTONW, nIndexTo, (LPARAM)&(btnInfo->btn));
 
         TOOLBAR_SendNotify(&hdr, custInfo->tbInfo, TBN_TOOLBARCHANGE);
     }
@@ -1888,17 +1891,17 @@
 
     TRACE("Remove: index %d\n", index);
 
-    btnInfo = (PCUSTOMBUTTON)SendMessageA(hwndList, LB_GETITEMDATA, index, 0);
+    btnInfo = (PCUSTOMBUTTON)SendMessageW(hwndList, LB_GETITEMDATA, index, 0);
 
     /* send TBN_QUERYDELETE notification */
     if (TOOLBAR_IsButtonRemovable(custInfo->tbInfo, index, btnInfo))
     {
         NMHDR hdr;
 
-        SendMessageA(hwndList, LB_DELETESTRING, index, 0);
-        SendMessageA(hwndList, LB_SETCURSEL, index , 0);
+        SendMessageW(hwndList, LB_DELETESTRING, index, 0);
+        SendMessageW(hwndList, LB_SETCURSEL, index , 0);
 
-        SendMessageA(custInfo->tbHwnd, TB_DELETEBUTTON, index, 0);
+        SendMessageW(custInfo->tbHwnd, TB_DELETEBUTTON, index, 0);
 
         /* insert into 'available button' list */
         if (!(btnInfo->btn.fsStyle & BTNS_SEP))
@@ -1919,7 +1922,7 @@
     case DL_BEGINDRAG:
     {
         INT nCurrentItem = LBItemFromPt(hwndList, pDLI->ptCursor, TRUE);
-        INT nCount = SendMessageA(hwndList, LB_GETCOUNT, 0, 0);
+        INT nCount = SendMessageW(hwndList, LB_GETCOUNT, 0, 0);
         /* no dragging for last item (separator) */
         if (nCurrentItem >= (nCount - 1)) return FALSE;
         return TRUE;
@@ -1927,7 +1930,7 @@
     case DL_DRAGGING:
     {
         INT nCurrentItem = LBItemFromPt(hwndList, pDLI->ptCursor, TRUE);
-        INT nCount = SendMessageA(hwndList, LB_GETCOUNT, 0, 0);
+        INT nCount = SendMessageW(hwndList, LB_GETCOUNT, 0, 0);
         /* no dragging past last item (separator) */
         if ((nCurrentItem >= 0) && (nCurrentItem < (nCount - 1)))
         {
@@ -1954,8 +1957,8 @@
     case DL_DROPPED:
     {
         INT nIndexTo = LBItemFromPt(hwndList, pDLI->ptCursor, TRUE);
-        INT nIndexFrom = SendMessageA(hwndList, LB_GETCURSEL, 0, 0);
-        INT nCount = SendMessageA(hwndList, LB_GETCOUNT, 0, 0);
+        INT nIndexFrom = SendMessageW(hwndList, LB_GETCURSEL, 0, 0);
+        INT nCount = SendMessageW(hwndList, LB_GETCOUNT, 0, 0);
         if ((nIndexTo >= 0) && (nIndexTo < (nCount - 1)))
         {
             /* clear drag arrow */
@@ -1975,13 +1978,13 @@
         }
         break;
     }
-	case DL_CANCELDRAG:
+    case DL_CANCELDRAG:
         /* Clear drag arrow */
         DrawInsert(hwnd, hwndList, -1);
         break;
     }
 
-	return 0;
+    return 0;
 }
 
 /* drag list notification function for available buttons list box */
@@ -1991,19 +1994,13 @@
     switch (pDLI->uNotification)
     {
     case DL_BEGINDRAG:
-    {
-        INT nCurrentItem = LBItemFromPt(hwndList, pDLI->ptCursor, TRUE);
-        INT nCount = SendMessageA(hwndList, LB_GETCOUNT, 0, 0);
-        /* no dragging for last item (separator) */
-        if (nCurrentItem >= (nCount - 1)) return FALSE;
         return TRUE;
-    }
     case DL_DRAGGING:
     {
         INT nCurrentItem = LBItemFromPt(hwndList, pDLI->ptCursor, TRUE);
-        INT nCount = SendMessageA(hwndList, LB_GETCOUNT, 0, 0);
+        INT nCount = SendMessageW(hwndList, LB_GETCOUNT, 0, 0);
         /* no dragging past last item (separator) */
-        if ((nCurrentItem >= 0) && (nCurrentItem < (nCount - 1)))
+        if ((nCurrentItem >= 0) && (nCurrentItem < nCount))
         {
             DrawInsert(hwnd, hwndList, nCurrentItem);
             /* FIXME: native uses "move button" cursor */
@@ -2028,9 +2025,9 @@
     case DL_DROPPED:
     {
         INT nIndexTo = LBItemFromPt(hwndList, pDLI->ptCursor, TRUE);
-        INT nCount = SendMessageA(hwndList, LB_GETCOUNT, 0, 0);
-        INT nIndexFrom = SendDlgItemMessageA(hwnd, IDC_AVAILBTN_LBOX, LB_GETCURSEL, 0, 0);
-        if ((nIndexTo >= 0) && (nIndexTo < (nCount - 1)))
+        INT nCount = SendMessageW(hwndList, LB_GETCOUNT, 0, 0);
+        INT nIndexFrom = SendDlgItemMessageW(hwnd, IDC_AVAILBTN_LBOX, LB_GETCURSEL, 0, 0);
+        if ((nIndexTo >= 0) && (nIndexTo < nCount))
         {
             /* clear drag arrow */
             DrawInsert(hwnd, hwndList, -1);
@@ -2038,12 +2035,12 @@
             TOOLBAR_Cust_AddButton(custInfo, hwnd, nIndexFrom, nIndexTo);
         }
     }
-	case DL_CANCELDRAG:
+    case DL_CANCELDRAG:
         /* Clear drag arrow */
         DrawInsert(hwnd, hwndList, -1);
         break;
-	}
-	return 0;
+    }
+    return 0;
 }
 
 extern UINT uDragListMessage;
@@ -2102,11 +2099,11 @@
 		    /* send TBN_QUERYDELETE notification */
                     btnInfo->bRemovable = TOOLBAR_IsButtonRemovable(infoPtr, i, btnInfo);
 
-		    index = (int)SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_ADDSTRING, 0, 0);
-		    SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETITEMDATA, index, (LPARAM)btnInfo);
+		    index = (int)SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_ADDSTRING, 0, 0);
+		    SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETITEMDATA, index, (LPARAM)btnInfo);
 		}
 
-		SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETITEMHEIGHT, 0, infoPtr->nBitmapHeight + 8);
+		SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETITEMHEIGHT, 0, infoPtr->nBitmapHeight + 8);
 
 		/* insert separator button into 'available buttons' list */
 		btnInfo = (PCUSTOMBUTTON)Alloc(sizeof(CUSTOMBUTTON));
@@ -2115,8 +2112,8 @@
 		btnInfo->bVirtual = FALSE;
 		btnInfo->bRemovable = TRUE;
 		LoadStringW (COMCTL32_hModule, IDS_SEPARATOR, btnInfo->text, 64);
-		index = (int)SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_ADDSTRING, 0, (LPARAM)btnInfo);
-		SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_SETITEMDATA, index, (LPARAM)btnInfo);
+		index = (int)SendDlgItemMessageW (hwnd, IDC_AVAILBTN_LBOX, LB_ADDSTRING, 0, (LPARAM)btnInfo);
+		SendDlgItemMessageW (hwnd, IDC_AVAILBTN_LBOX, LB_SETITEMDATA, index, (LPARAM)btnInfo);
 
 		/* insert all buttons into dsa */
 		for (i = 0;; i++)
@@ -2150,7 +2147,7 @@
 		    }
 		    else
 		    {
-                        btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageA (hwnd, 
+                        btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageW (hwnd, 
                             IDC_TOOLBARBTN_LBOX, LB_GETITEMDATA, index, 0);
                     }
 
@@ -2171,10 +2168,10 @@
 			TOOLBAR_Cust_InsertAvailButton(hwnd, btnInfo);
 		}
 
-		SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_SETITEMHEIGHT, 0, infoPtr->nBitmapHeight + 8);
+		SendDlgItemMessageW (hwnd, IDC_AVAILBTN_LBOX, LB_SETITEMHEIGHT, 0, infoPtr->nBitmapHeight + 8);
 
 		/* select first item in the 'available' list */
-		SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_SETCURSEL, 0, 0);
+		SendDlgItemMessageW (hwnd, IDC_AVAILBTN_LBOX, LB_SETCURSEL, 0, 0);
 
 		/* append 'virtual' separator button to the 'toolbar buttons' list */
 		btnInfo = (PCUSTOMBUTTON)Alloc(sizeof(CUSTOMBUTTON));
@@ -2183,18 +2180,18 @@
 		btnInfo->bVirtual = TRUE;
 		btnInfo->bRemovable = FALSE;
 		LoadStringW (COMCTL32_hModule, IDS_SEPARATOR, btnInfo->text, 64);
-		index = (int)SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_ADDSTRING, 0, (LPARAM)btnInfo);
-		SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETITEMDATA, index, (LPARAM)btnInfo);
+		index = (int)SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_ADDSTRING, 0, (LPARAM)btnInfo);
+		SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETITEMDATA, index, (LPARAM)btnInfo);
 
 		/* select last item in the 'toolbar' list */
-		SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETCURSEL, index, 0);
-		SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETTOPINDEX, index, 0);
+		SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETCURSEL, index, 0);
+		SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETTOPINDEX, index, 0);
 
         MakeDragList(GetDlgItem(hwnd, IDC_TOOLBARBTN_LBOX));
         MakeDragList(GetDlgItem(hwnd, IDC_AVAILBTN_LBOX));
 
 		/* set focus and disable buttons */
-		PostMessageA (hwnd, WM_USER, 0, 0);
+		PostMessageW (hwnd, WM_USER, 0, 0);
 	    }
 	    return TRUE;
 
@@ -2220,8 +2217,8 @@
 			int count;
 			int index;
 
-			count = SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETCOUNT, 0, 0);
-			index = SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETCURSEL, 0, 0);
+			count = SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETCOUNT, 0, 0);
+			index = SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETCURSEL, 0, 0);
 
 			/* send TBN_QUERYINSERT notification */
 			nmtb.iItem = index;
@@ -2229,7 +2226,7 @@
 					TBN_QUERYINSERT);
 
 			/* get list box item */
-			btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETITEMDATA, index, 0);
+			btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETITEMDATA, index, 0);
 
 			if (index == (count - 1))
 			{
@@ -2261,21 +2258,21 @@
 
 		case IDC_MOVEUP_BTN:
 		    {
-			int index = SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETCURSEL, 0, 0);
+			int index = SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETCURSEL, 0, 0);
 			TOOLBAR_Cust_MoveButton(custInfo, hwnd, index, index-1);
 		    }
 		    break;
 
 		case IDC_MOVEDN_BTN: /* move down */
 		    {
-			int index = SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETCURSEL, 0, 0);
+			int index = SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETCURSEL, 0, 0);
 			TOOLBAR_Cust_MoveButton(custInfo, hwnd, index, index+1);
 		    }
 		    break;
 
 		case IDC_REMOVE_BTN: /* remove button */
 		    {
-			int index = SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETCURSEL, 0, 0);
+			int index = SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETCURSEL, 0, 0);
 
 			if (LB_ERR == index)
 				break;
@@ -2295,8 +2292,8 @@
 			int index;
 			int indexto;
 
-			index = SendDlgItemMessageA(hwnd, IDC_AVAILBTN_LBOX, LB_GETCURSEL, 0, 0);
-			indexto = SendDlgItemMessageA(hwnd, IDC_TOOLBARBTN_LBOX, LB_GETCURSEL, 0, 0);
+			index = SendDlgItemMessageW(hwnd, IDC_AVAILBTN_LBOX, LB_GETCURSEL, 0, 0);
+			indexto = SendDlgItemMessageW(hwnd, IDC_TOOLBARBTN_LBOX, LB_GETCURSEL, 0, 0);
 
 			TOOLBAR_Cust_AddButton(custInfo, hwnd, index, indexto);
 		    }
@@ -2314,25 +2311,25 @@
 		int i;
 
 		/* delete items from 'toolbar buttons' listbox*/
-		count = SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETCOUNT, 0, 0);
+		count = SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETCOUNT, 0, 0);
 		for (i = 0; i < count; i++)
 		{
-		    btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETITEMDATA, i, 0);
+		    btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETITEMDATA, i, 0);
 		    Free(btnInfo);
-		    SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETITEMDATA, 0, 0);
+		    SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETITEMDATA, 0, 0);
 		}
-		SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_RESETCONTENT, 0, 0);
+		SendDlgItemMessageW (hwnd, IDC_TOOLBARBTN_LBOX, LB_RESETCONTENT, 0, 0);
 
 
 		/* delete items from 'available buttons' listbox*/
-		count = SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_GETCOUNT, 0, 0);
+		count = SendDlgItemMessageW (hwnd, IDC_AVAILBTN_LBOX, LB_GETCOUNT, 0, 0);
 		for (i = 0; i < count; i++)
 		{
-		    btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_GETITEMDATA, i, 0);
+		    btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageW (hwnd, IDC_AVAILBTN_LBOX, LB_GETITEMDATA, i, 0);
 		    Free(btnInfo);
-		    SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_SETITEMDATA, i, 0);
+		    SendDlgItemMessageW (hwnd, IDC_AVAILBTN_LBOX, LB_SETITEMDATA, i, 0);
 		}
-		SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_RESETCONTENT, 0, 0);
+		SendDlgItemMessageW (hwnd, IDC_AVAILBTN_LBOX, LB_RESETCONTENT, 0, 0);
             }
 	    return TRUE;
 
@@ -2348,7 +2345,7 @@
 		COLORREF oldBk = 0;
 
 		/* get item data */
-		btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageA (hwnd, wParam, LB_GETITEMDATA, (WPARAM)lpdis->itemID, 0);
+		btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageW (hwnd, wParam, LB_GETITEMDATA, (WPARAM)lpdis->itemID, 0);
 		if (btnInfo == NULL)
 		{
 		    FIXME("btnInfo invalid!\n");
@@ -2476,17 +2473,17 @@
 	    /* FIXME: on windows the size of the images is 25x24 but the size of the bitmap
              * in rsrc is only 24x24. Fix the bitmap (how?) and then fix this
              */
-	    SendMessageA (hwnd, TB_SETBITMAPSIZE, 0,
+	    SendMessageW (hwnd, TB_SETBITMAPSIZE, 0,
 			  MAKELPARAM((WORD)24, (WORD)24));
-	    SendMessageA (hwnd, TB_SETBUTTONSIZE, 0,
+	    SendMessageW (hwnd, TB_SETBUTTONSIZE, 0,
 			  MAKELPARAM((WORD)31, (WORD)30));
 	}
 	else
 	{
 	    /* small icons */
-	    SendMessageA (hwnd, TB_SETBITMAPSIZE, 0,
+	    SendMessageW (hwnd, TB_SETBITMAPSIZE, 0,
 			  MAKELPARAM((WORD)16, (WORD)16));
-	    SendMessageA (hwnd, TB_SETBUTTONSIZE, 0,
+	    SendMessageW (hwnd, TB_SETBUTTONSIZE, 0,
 			  MAKELPARAM((WORD)22, (WORD)22));
 	}
 
@@ -2704,16 +2701,16 @@
 	btnPtr->bHot      = FALSE;
 
 	if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & BTNS_SEP)) {
-	    TTTOOLINFOA ti;
+	    TTTOOLINFOW ti;
 
-	    ZeroMemory (&ti, sizeof(TTTOOLINFOA));
-	    ti.cbSize   = sizeof (TTTOOLINFOA);
+	    ZeroMemory (&ti, sizeof(ti));
+	    ti.cbSize   = sizeof(ti);
 	    ti.hwnd     = hwnd;
 	    ti.uId      = btnPtr->idCommand;
 	    ti.hinst    = 0;
-	    ti.lpszText = LPSTR_TEXTCALLBACKA;
+	    ti.lpszText = LPSTR_TEXTCALLBACKW;
 
-	    SendMessageA (infoPtr->hwndToolTip, TTM_ADDTOOLA,
+	    SendMessageW (infoPtr->hwndToolTip, TTM_ADDTOOLW,
 			    0, (LPARAM)&ti);
 	}
     }
@@ -3168,16 +3165,16 @@
     TOOLBAR_SendNotify ((NMHDR *) &nmhdr, infoPtr,
 		    TBN_BEGINADJUST);
 
-    if (!(hRes = FindResourceA (COMCTL32_hModule,
-                                MAKEINTRESOURCEA(IDD_TBCUSTOMIZE),
-                                (LPSTR)RT_DIALOG)))
+    if (!(hRes = FindResourceW (COMCTL32_hModule,
+                                MAKEINTRESOURCEW(IDD_TBCUSTOMIZE),
+                                (LPWSTR)RT_DIALOG)))
 	return FALSE;
 
     if(!(template = (LPVOID)LoadResource (COMCTL32_hModule, hRes)))
 	return FALSE;
 
-    ret = DialogBoxIndirectParamA ((HINSTANCE)GetWindowLongPtrW(hwnd, GWLP_HINSTANCE),
-                                   (LPDLGTEMPLATEA)template,
+    ret = DialogBoxIndirectParamW ((HINSTANCE)GetWindowLongPtrW(hwnd, GWLP_HINSTANCE),
+                                   (LPDLGTEMPLATEW)template,
                                    hwnd,
                                    TOOLBAR_CustomizeDialogProc,
                                    (LPARAM)&custInfo);
@@ -3196,24 +3193,31 @@
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
     INT nIndex = (INT)wParam;
     NMTOOLBARW nmtb;
+    TBUTTON_INFO *btnPtr = &infoPtr->buttons[nIndex];
 
     if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
-	return FALSE;
+        return FALSE;
 
     memset(&nmtb, 0, sizeof(nmtb));
-    nmtb.iItem = nIndex;
+    nmtb.iItem = btnPtr->idCommand;
+    nmtb.tbButton.iBitmap = btnPtr->iBitmap;
+    nmtb.tbButton.idCommand = btnPtr->idCommand;
+    nmtb.tbButton.fsState = btnPtr->fsState;
+    nmtb.tbButton.fsStyle = btnPtr->fsStyle;
+    nmtb.tbButton.dwData = btnPtr->dwData;
+    nmtb.tbButton.iString = btnPtr->iString;
     TOOLBAR_SendNotify((NMHDR *)&nmtb, infoPtr, TBN_DELETINGBUTTON);
 
     if ((infoPtr->hwndToolTip) &&
-	!(infoPtr->buttons[nIndex].fsStyle & BTNS_SEP)) {
-	TTTOOLINFOA ti;
+	!(btnPtr->fsStyle & BTNS_SEP)) {
+	TTTOOLINFOW ti;
 
-	ZeroMemory (&ti, sizeof(TTTOOLINFOA));
-	ti.cbSize   = sizeof (TTTOOLINFOA);
+	ZeroMemory (&ti, sizeof(ti));
+	ti.cbSize   = sizeof(ti);
 	ti.hwnd     = hwnd;
 	ti.uId      = infoPtr->buttons[nIndex].idCommand;
 
-	SendMessageA (infoPtr->hwndToolTip, TTM_DELTOOLA, 0, (LPARAM)&ti);
+	SendMessageW (infoPtr->hwndToolTip, TTM_DELTOOLW, 0, (LPARAM)&ti);
     }
 
     if (infoPtr->nNumButtons == 1) {
@@ -3733,7 +3737,7 @@
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
 
-    TRACE("%s hwnd=%p stub!\n",
+    TRACE("%s hwnd=%p\n",
 	   infoPtr->bUnicode ? "TRUE" : "FALSE", hwnd);
 
     return infoPtr->bUnicode;
@@ -3879,16 +3883,16 @@
         infoPtr->buttons[nIndex].iString   = lpTbb->iString;
 
     if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & BTNS_SEP)) {
-	TTTOOLINFOA ti;
+	TTTOOLINFOW ti;
 
-	ZeroMemory (&ti, sizeof(TTTOOLINFOA));
-	ti.cbSize   = sizeof (TTTOOLINFOA);
+	ZeroMemory (&ti, sizeof(ti));
+	ti.cbSize   = sizeof (ti);
 	ti.hwnd     = hwnd;
 	ti.uId      = lpTbb->idCommand;
 	ti.hinst    = 0;
-	ti.lpszText = LPSTR_TEXTCALLBACKA;
+	ti.lpszText = LPSTR_TEXTCALLBACKW;
 
-	SendMessageA (infoPtr->hwndToolTip, TTM_ADDTOOLA,
+	SendMessageW (infoPtr->hwndToolTip, TTM_ADDTOOLW,
 			0, (LPARAM)&ti);
     }
 
@@ -5104,7 +5108,7 @@
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
     BOOL bTemp;
 
-    TRACE("%s hwnd=%p stub!\n",
+    TRACE("%s hwnd=%p\n",
 	   ((BOOL)wParam) ? "TRUE" : "FALSE", hwnd);
 
     bTemp = infoPtr->bUnicode;
@@ -5361,12 +5365,12 @@
     infoPtr->nNumStrings = 0;
 
     infoPtr->bCaptured = FALSE;
-    infoPtr->bUnicode = IsWindowUnicode (hwnd);
     infoPtr->nButtonDown = -1;
     infoPtr->nButtonDrag = -1;
     infoPtr->nOldHit = -1;
     infoPtr->nHotItem = -1;
     infoPtr->hwndNotify = ((LPCREATESTRUCTW)lParam)->hwndParent;
+    infoPtr->bUnicode = IsWindowUnicode (infoPtr->hwndNotify);
     infoPtr->bBtnTranspnt = (dwStyle & (TBSTYLE_FLAT | TBSTYLE_LIST));
     infoPtr->dwDTFlags = (dwStyle & TBSTYLE_LIST) ? DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS: DT_CENTER | DT_END_ELLIPSIS;
     infoPtr->bAnchor = FALSE; /* no anchor highlighting */
@@ -5508,11 +5512,11 @@
 	parent = GetParent(hwnd);
 	MapWindowPoints(hwnd, parent, &pt, 1);
 	OffsetWindowOrgEx (hdc, pt.x, pt.y, &ptorig);
-	ret = SendMessageA (parent, WM_ERASEBKGND, wParam, lParam);
+	ret = SendMessageW (parent, WM_ERASEBKGND, wParam, lParam);
 	SetWindowOrgEx (hdc, ptorig.x, ptorig.y, 0);
     }
     if (!ret)
-	ret = DefWindowProcA (hwnd, WM_ERASEBKGND, wParam, lParam);
+	ret = DefWindowProcW (hwnd, WM_ERASEBKGND, wParam, lParam);
 
     if ((infoPtr->dwStyle & TBSTYLE_CUSTOMERASE) &&
 	(infoPtr->dwBaseCustDraw & CDRF_NOTIFYPOSTERASE)) {
@@ -5857,7 +5861,7 @@
 
 	if (btnPtr->fsState & TBSTATE_ENABLED)
 	{
-	    SendMessageA (infoPtr->hwndNotify, WM_COMMAND,
+	    SendMessageW (infoPtr->hwndNotify, WM_COMMAND,
 	      MAKEWPARAM(infoPtr->buttons[nHit].idCommand, 0), (LPARAM)hwnd);
         }
     }
@@ -6064,7 +6068,7 @@
 TOOLBAR_NCActivate (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
 /*    if (wndPtr->dwStyle & CCS_NODIVIDER) */
-	return DefWindowProcA (hwnd, WM_NCACTIVATE, wParam, lParam);
+	return DefWindowProcW (hwnd, WM_NCACTIVATE, wParam, lParam);
 /*    else */
 /*	return TOOLBAR_NCPaint (wndPtr, wParam, lParam); */
 }
@@ -6076,7 +6080,7 @@
     if (!(GetWindowLongW(hwnd, GWL_STYLE) & CCS_NODIVIDER))
 	((LPRECT)lParam)->top += GetSystemMetrics(SM_CYEDGE);
 
-    return DefWindowProcA (hwnd, WM_NCCALCSIZE, wParam, lParam);
+    return DefWindowProcW (hwnd, WM_NCCALCSIZE, wParam, lParam);
 }
 
 
@@ -6153,7 +6157,7 @@
 	SetWindowLongW (hwnd, GWL_STYLE, cs->style | styleadd);
     }
 
-    return DefWindowProcA (hwnd, WM_NCCREATE, wParam, lParam);
+    return DefWindowProcW (hwnd, WM_NCCREATE, wParam, lParam);
 }
 
 
@@ -6167,7 +6171,7 @@
     if (dwStyle & WS_MINIMIZE)
 	return 0; /* Nothing to do */
 
-    DefWindowProcA (hwnd, WM_NCPAINT, wParam, lParam);
+    DefWindowProcW (hwnd, WM_NCPAINT, wParam, lParam);
 
     if (!(hdc = GetDCEx (hwnd, 0, DCX_USESTYLE | DCX_WINDOW)))
 	return 0;
@@ -6389,7 +6393,7 @@
         return NFR_UNICODE;
 
     if (lParam == NF_REQUERY) {
-	i = SendMessageA(infoPtr->hwndNotify,
+	i = SendMessageW(infoPtr->hwndNotify,
 			 WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwndSelf, NF_QUERY);
 	if ((i < NFR_ANSI) || (i > NFR_UNICODE)) {
 	    ERR("wrong response to WM_NOTIFYFORMAT (%d), assuming ANSI\n",
@@ -6638,7 +6642,7 @@
 	  hwnd, uMsg, /* SPY_GetMsgName(uMsg), */ wParam, lParam);
 
     if (!TOOLBAR_GetInfoPtr(hwnd) && (uMsg != WM_NCCREATE))
-	return DefWindowProcA( hwnd, uMsg, wParam, lParam );
+	return DefWindowProcW( hwnd, uMsg, wParam, lParam );
 
     switch (uMsg)
     {
@@ -7018,17 +7022,17 @@
 	case WM_DRAWITEM:
 	case WM_MEASUREITEM:
 	case WM_VKEYTOITEM:
-            return SendMessageA (infoPtr->hwndNotify, uMsg, wParam, lParam);
+            return SendMessageW (infoPtr->hwndNotify, uMsg, wParam, lParam);
 
 	/* We see this in Outlook Express 5.x and just does DefWindowProc */
         case PGM_FORWARDMOUSE:
-	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
+	    return DefWindowProcW (hwnd, uMsg, wParam, lParam);
 
 	default:
 	    if ((uMsg >= WM_USER) && (uMsg < WM_APP))
 		ERR("unknown msg %04x wp=%08x lp=%08lx\n",
 		     uMsg, wParam, lParam);
-	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
+	    return DefWindowProcW (hwnd, uMsg, wParam, lParam);
     }
     return 0;
 }
@@ -7037,25 +7041,25 @@
 VOID
 TOOLBAR_Register (void)
 {
-    WNDCLASSA wndClass;
+    WNDCLASSW wndClass;
 
-    ZeroMemory (&wndClass, sizeof(WNDCLASSA));
+    ZeroMemory (&wndClass, sizeof(WNDCLASSW));
     wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS;
-    wndClass.lpfnWndProc   = (WNDPROC)ToolbarWindowProc;
+    wndClass.lpfnWndProc   = ToolbarWindowProc;
     wndClass.cbClsExtra    = 0;
     wndClass.cbWndExtra    = sizeof(TOOLBAR_INFO *);
-    wndClass.hCursor       = LoadCursorA (0, (LPSTR)IDC_ARROW);
-    wndClass.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
-    wndClass.lpszClassName = TOOLBARCLASSNAMEA;
+    wndClass.hCursor       = LoadCursorW (0, (LPWSTR)IDC_ARROW);
+    wndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
+    wndClass.lpszClassName = TOOLBARCLASSNAMEW;
 
-    RegisterClassA (&wndClass);
+    RegisterClassW (&wndClass);
 }
 
 
 VOID
 TOOLBAR_Unregister (void)
 {
-    UnregisterClassA (TOOLBARCLASSNAMEA, NULL);
+    UnregisterClassW (TOOLBARCLASSNAMEW, NULL);
 }
 
 static HIMAGELIST TOOLBAR_InsertImageList(PIMLENTRY **pies, INT *cies, HIMAGELIST himl, INT id)
@@ -7172,10 +7176,12 @@
 static BOOL TOOLBAR_IsButtonRemovable(TOOLBAR_INFO *infoPtr,
 	int iItem, PCUSTOMBUTTON btnInfo)
 {
-    NMTOOLBARA nmtb;
+    NMTOOLBARW nmtb;
 
+    /* MSDN states that iItem is the index of the button, rather than the
+     * command ID as used by every other NMTOOLBAR notification */
     nmtb.iItem = iItem;
     memcpy(&nmtb.tbButton, &btnInfo->btn, sizeof(TBBUTTON));
 
-    return TOOLBAR_SendNotify ((NMHDR *) &nmtb, infoPtr, TBN_QUERYDELETE);
+    return TOOLBAR_SendNotify(&nmtb.hdr, infoPtr, TBN_QUERYDELETE);
 }

reactos/lib/comctl32
tooltips.c 1.8 -> 1.9
diff -u -r1.8 -r1.9
--- tooltips.c	19 Sep 2004 09:50:06 -0000	1.8
+++ tooltips.c	20 Oct 2004 08:36:55 -0000	1.9
@@ -192,7 +192,7 @@
 
     DeleteObject (infoPtr->hFont);
     nclm.cbSize = sizeof(nclm);
-    SystemParametersInfoW (SPI_GETNONCLIENTMETRICS, 0, &nclm, 0);
+    SystemParametersInfoW (SPI_GETNONCLIENTMETRICS, sizeof(nclm), &nclm, 0);
     infoPtr->hFont = CreateFontIndirectW (&nclm.lfStatusFont);
 
     DeleteObject (infoPtr->hTitleFont);
@@ -318,7 +318,7 @@
     ttnmdi.lParam = toolPtr->lParam;
 
     TRACE("hdr.idFrom = %x\n", ttnmdi.hdr.idFrom);
-    SendMessageA(toolPtr->hwnd, WM_NOTIFY,
+    SendMessageW(toolPtr->hwnd, WM_NOTIFY,
                  (WPARAM)toolPtr->uId, (LPARAM)&ttnmdi);
 
     if (HIWORD((UINT)ttnmdi.lpszText) == 0) {
@@ -522,7 +522,7 @@
     hdr.hwndFrom = hwnd;
     hdr.idFrom = toolPtr->uId;
     hdr.code = TTN_SHOW;
-    SendMessageA (toolPtr->hwnd, WM_NOTIFY,
+    SendMessageW (toolPtr->hwnd, WM_NOTIFY,
 		    (WPARAM)toolPtr->uId, (LPARAM)&hdr);
 
     TRACE("%s\n", debugstr_w(infoPtr->szTipText));
@@ -698,7 +698,7 @@
     hdr.hwndFrom = hwnd;
     hdr.idFrom = toolPtr->uId;
     hdr.code = TTN_POP;
-    SendMessageA (toolPtr->hwnd, WM_NOTIFY,
+    SendMessageW (toolPtr->hwnd, WM_NOTIFY,
 		    (WPARAM)toolPtr->uId, (LPARAM)&hdr);
 
     infoPtr->nCurrentTool = -1;
@@ -736,7 +736,7 @@
     hdr.hwndFrom = hwnd;
     hdr.idFrom = toolPtr->uId;
     hdr.code = TTN_SHOW;
-    SendMessageA (toolPtr->hwnd, WM_NOTIFY,
+    SendMessageW (toolPtr->hwnd, WM_NOTIFY,
 		    (WPARAM)toolPtr->uId, (LPARAM)&hdr);
 
     TRACE("%s\n", debugstr_w(infoPtr->szTipText));
@@ -822,7 +822,7 @@
     hdr.hwndFrom = hwnd;
     hdr.idFrom = toolPtr->uId;
     hdr.code = TTN_POP;
-    SendMessageA (toolPtr->hwnd, WM_NOTIFY,
+    SendMessageW (toolPtr->hwnd, WM_NOTIFY,
 		    (WPARAM)toolPtr->uId, (LPARAM)&hdr);
 
     SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0,
@@ -936,7 +936,7 @@
     INT nTool;
 
     GetCursorPos (&pt);
-    hwndTool = (HWND)SendMessageA (hwnd, TTM_WINDOWFROMPOINT, 0, (LPARAM)&pt);
+    hwndTool = (HWND)SendMessageW (hwnd, TTM_WINDOWFROMPOINT, 0, (LPARAM)&pt);
     if (hwndTool == 0)
 	return -1;
 
@@ -1048,7 +1048,7 @@
 	TRACE("subclassing installed!\n");
     }
 
-    nResult = (INT) SendMessageA (toolPtr->hwnd, WM_NOTIFYFORMAT,
+    nResult = (INT) SendMessageW (toolPtr->hwnd, WM_NOTIFYFORMAT,
 				  (WPARAM)hwnd, (LPARAM)NF_QUERY);
     if (nResult == NFR_ANSI) {
         toolPtr->bNotifyUnicode = FALSE;
@@ -1138,7 +1138,7 @@
 	TRACE("subclassing installed!\n");
     }
 
-    nResult = (INT) SendMessageA (toolPtr->hwnd, WM_NOTIFYFORMAT,
+    nResult = (INT) SendMessageW (toolPtr->hwnd, WM_NOTIFYFORMAT,
 				  (WPARAM)hwnd, (LPARAM)NF_QUERY);
     if (nResult == NFR_ANSI) {
         toolPtr->bNotifyUnicode = FALSE;
@@ -2415,7 +2415,7 @@
 	}
     }
 
-    return DefWindowProcA (hwnd, WM_NCHITTEST, wParam, lParam);
+    return DefWindowProcW (hwnd, WM_NCHITTEST, wParam, lParam);
 }
 
 
@@ -2464,8 +2464,9 @@
 
     return 0;
 }
+
 /******************************************************************
- * TOOLTIPS_OnWMGetTextLength
+ * TOOLTIPS_GetTextLength
  *
  * This function is called when the tooltip receive a
  * WM_GETTEXTLENGTH message.
@@ -2473,12 +2474,12 @@
  * lParam : not used
  *
  * returns the length, in characters, of the tip text
- ******************************************************************/
+ */
 static LRESULT
-TOOLTIPS_OnWMGetTextLength(HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_GetTextLength(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
-    return lstrlenW(infoPtr->szTipText);
+    return strlenW(infoPtr->szTipText);
 }
 
 /******************************************************************
@@ -2491,17 +2492,21 @@
  *          the tip text
  *
  * returns the number of characters copied
- ******************************************************************/
+ */
 static LRESULT
 TOOLTIPS_OnWMGetText (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
+    LRESULT res;
+    LPWSTR pszText = (LPWSTR)lParam;
 
-    if(!infoPtr || !(infoPtr->szTipText))
+    if(!infoPtr->szTipText || !wParam)
         return 0;
 
-    return WideCharToMultiByte(CP_ACP, 0, infoPtr->szTipText, -1,
-			       (LPSTR)lParam, wParam, NULL, NULL);
+    res = min(strlenW(infoPtr->szTipText)+1, wParam);
+    memcpy(pszText, infoPtr->szTipText, res*sizeof(WCHAR));
+    pszText[res-1] = '\0';
+    return res-1;
 }
 
 static LRESULT
@@ -2597,7 +2602,7 @@
 {
     TRACE("hwnd=%p msg=%x wparam=%x lParam=%lx\n", hwnd, uMsg, wParam, lParam);
     if (!TOOLTIPS_GetInfoPtr(hwnd) && (uMsg != WM_CREATE) && (uMsg != WM_NCCREATE))
-        return DefWindowProcA (hwnd, uMsg, wParam, lParam);
+        return DefWindowProcW (hwnd, uMsg, wParam, lParam);
     switch (uMsg)
     {
 	case TTM_ACTIVATE:
@@ -2741,7 +2746,7 @@
 	    return TOOLTIPS_OnWMGetText (hwnd, wParam, lParam);
 
 	case WM_GETTEXTLENGTH:
-	    return TOOLTIPS_OnWMGetTextLength (hwnd, wParam, lParam);
+	    return TOOLTIPS_GetTextLength (hwnd, wParam, lParam);
 
 	case WM_LBUTTONDOWN:
 	case WM_LBUTTONUP:
@@ -2777,7 +2782,7 @@
 	    if ((uMsg >= WM_USER) && (uMsg < WM_APP))
 		ERR("unknown msg %04x wp=%08x lp=%08lx\n",
 		     uMsg, wParam, lParam);
-	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
+	    return DefWindowProcW (hwnd, uMsg, wParam, lParam);
     }
     return 0;
 }
@@ -2786,18 +2791,18 @@
 VOID
 TOOLTIPS_Register (void)
 {
-    WNDCLASSA wndClass;
+    WNDCLASSW wndClass;
 
-    ZeroMemory (&wndClass, sizeof(WNDCLASSA));
+    ZeroMemory (&wndClass, sizeof(WNDCLASSW));
     wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS;
-    wndClass.lpfnWndProc   = (WNDPROC)TOOLTIPS_WindowProc;
+    wndClass.lpfnWndProc   = TOOLTIPS_WindowProc;
     wndClass.cbClsExtra    = 0;
     wndClass.cbWndExtra    = sizeof(TOOLTIPS_INFO *);
-    wndClass.hCursor       = LoadCursorA (0, (LPSTR)IDC_ARROW);
+    wndClass.hCursor       = LoadCursorW (0, (LPWSTR)IDC_ARROW);
     wndClass.hbrBackground = 0;
-    wndClass.lpszClassName = TOOLTIPS_CLASSA;
+    wndClass.lpszClassName = TOOLTIPS_CLASSW;
 
-    RegisterClassA (&wndClass);
+    RegisterClassW (&wndClass);
 
     hTooltipIcons[TTI_NONE] = NULL;
     hTooltipIcons[TTI_INFO] = LoadImageW(COMCTL32_hModule,
@@ -2815,5 +2820,5 @@
     int i;
     for (i = 0; i < TTI_ERROR+1; i++)
         DeleteObject(hTooltipIcons[i]);
-    UnregisterClassA (TOOLTIPS_CLASSA, NULL);
+    UnregisterClassW (TOOLTIPS_CLASSW, NULL);
 }

reactos/lib/comctl32
treeview.c 1.10 -> 1.11
diff -u -r1.10 -r1.11
--- treeview.c	19 Sep 2004 09:50:06 -0000	1.10
+++ treeview.c	20 Oct 2004 08:36:55 -0000	1.11
@@ -102,7 +102,7 @@
   UINT          uNumItems;      /* number of valid TREEVIEW_ITEMs */
   INT           cdmode;         /* last custom draw setting */
   UINT          uScrollTime;	/* max. time for scrolling in milliseconds */
-  BOOL		bRedraw;	/* if FALSE we validate but don't redraw in TREEVIEW_Paint() */
+  BOOL          bRedraw;        /* if FALSE we validate but don't redraw in TREEVIEW_Paint() */
 
   UINT          uItemHeight;    /* item height */
   BOOL          bHeightSet;
@@ -1077,7 +1077,7 @@
                 len = lstrlenW(tvItem->pszText) + 1;
             else
                 len = MultiByteToWideChar(CP_ACP, 0, (LPSTR)tvItem->pszText, -1, NULL, 0);
-            
+
             newText  = ReAlloc(wineItem->pszText, len * sizeof(WCHAR));
 
             if (newText == NULL) return FALSE;
@@ -1642,6 +1642,35 @@
     }
 }
 
+#define TVHEIGHT_MIN         16
+#define TVHEIGHT_FONT_ADJUST 3 /* 2 for focus border + 1 for margin some apps assume */
+
+/* Compute the natural height for items. */
+static UINT
+TREEVIEW_NaturalHeight(TREEVIEW_INFO *infoPtr)
+{
+    TEXTMETRICW tm;
+    HDC hdc = GetDC(0);
+    HFONT hOldFont = SelectObject(hdc, infoPtr->hFont);
+    UINT height;
+
+    /* Height is the maximum of:
+     * 16 (a hack because our fonts are tiny), and
+     * The text height + border & margin, and
+     * The size of the normal image list
+     */
+    GetTextMetricsW(hdc, &tm);
+    SelectObject(hdc, hOldFont);
+    ReleaseDC(0, hdc);
+
+    height = TVHEIGHT_MIN;
+    if (height < tm.tmHeight + tm.tmExternalLeading + TVHEIGHT_FONT_ADJUST)
+        height = tm.tmHeight + tm.tmExternalLeading + TVHEIGHT_FONT_ADJUST;
+    if (height < infoPtr->normalImageHeight)
+        height = infoPtr->normalImageHeight;
+    return height;
+}
+
 static LRESULT
 TREEVIEW_SetImageList(TREEVIEW_INFO *infoPtr, WPARAM wParam, HIMAGELIST himlNew)
 {
@@ -1688,6 +1717,25 @@
     if (oldWidth != infoPtr->normalImageWidth ||
         oldHeight != infoPtr->normalImageHeight)
     {
+        BOOL bRecalcVisible = FALSE;
+
+        if (oldHeight != infoPtr->normalImageHeight &&
+            !infoPtr->bHeightSet)
+        {
+            infoPtr->uItemHeight = TREEVIEW_NaturalHeight(infoPtr);
+            bRecalcVisible = TRUE;
+        }
+
+        if (infoPtr->normalImageWidth > MINIMUM_INDENT &&
+            infoPtr->normalImageWidth != infoPtr->uIndent)
+        {
+            infoPtr->uIndent = infoPtr->normalImageWidth;
+            bRecalcVisible = TRUE;
+        }
+
+        if (bRecalcVisible)
+            TREEVIEW_RecalculateVisibleOrder(infoPtr, NULL);
+
        TREEVIEW_UpdateSubTree(infoPtr, infoPtr->root);
        TREEVIEW_UpdateScrollBars(infoPtr);
     }
@@ -1697,24 +1745,6 @@
     return (LRESULT)himlOld;
 }
 
-/* Compute the natural height (based on the font size) for items. */
-static UINT
-TREEVIEW_NaturalHeight(TREEVIEW_INFO *infoPtr)
-{
-    TEXTMETRICW tm;
-    HDC hdc = GetDC(0);
-    HFONT hOldFont = SelectObject(hdc, infoPtr->hFont);
-
-    GetTextMetricsW(hdc, &tm);
-
-    SelectObject(hdc, hOldFont);
-    ReleaseDC(0, hdc);
-
-    /* The 16 is a hack because our fonts are tiny. */
-    /* add 2 for the focus border and 1 more for margin some apps assume */
-    return max(16, tm.tmHeight + tm.tmExternalLeading + 3);
-}
-
 static LRESULT
 TREEVIEW_SetItemHeight(TREEVIEW_INFO *infoPtr, INT newHeight)
 {
@@ -1967,7 +1997,7 @@
 
     if (tvItem->mask & TVIF_CHILDREN)
     {
-        if (TVIF_CHILDREN==I_CHILDRENCALLBACK)
+        if (wineItem->cChildren==I_CHILDRENCALLBACK)
             FIXME("I_CHILDRENCALLBACK not supported\n");
 	tvItem->cChildren = wineItem->cChildren;
     }
@@ -2044,7 +2074,7 @@
 
     if (!TREEVIEW_ValidItem(infoPtr, wineItem))
 	return FALSE;
-    
+
     /* store the orignal item values */
     originalItem = *wineItem;
 
@@ -2289,8 +2319,8 @@
 	    HBRUSH hbr    = CreateSolidBrush(infoPtr->clrBk);
 	    HBRUSH hbrOld = SelectObject(hdc, hbr);
 
-           Rectangle(hdc, centerx - rectsize - 1, centery - rectsize - 1,
-                     centerx + rectsize + 2, centery + rectsize + 2);
+	    Rectangle(hdc, centerx - rectsize - 1, centery - rectsize - 1,
+		      centerx + rectsize + 2, centery + rectsize + 2);
 
 	    SelectObject(hdc, hbrOld);
 	    DeleteObject(hbr);
@@ -2298,13 +2328,29 @@
 	    SelectObject(hdc, hOldPen);
 	    DeleteObject(hNewPen);
 
-	    MoveToEx(hdc, centerx - plussize + 1, centery, NULL);
-	    LineTo(hdc, centerx + plussize, centery);
+	    if (height < 16 || width < 16)
+	    {
+	        MoveToEx(hdc, centerx - plussize + 1, centery, NULL);
+	        LineTo(hdc, centerx + plussize, centery);
 
-	    if (!(item->state & TVIS_EXPANDED))
+	        if (!(item->state & TVIS_EXPANDED))
+	        {
+		    MoveToEx(hdc, centerx, centery - plussize + 1, NULL);
+		    LineTo(hdc, centerx, centery + plussize);
+	        }
+	    }
+	    else
 	    {
-		MoveToEx(hdc, centerx, centery - plussize + 1, NULL);
-		LineTo(hdc, centerx, centery + plussize);
+		Rectangle(hdc, centerx - plussize + 1, centery - 1,
+		centerx + plussize, centery + 2);
+
+		if (!(item->state & TVIS_EXPANDED))
+		{
+		    Rectangle(hdc, centerx - 1, centery - plussize + 1,
+		    centerx + 2, centery + plussize);
+		    SetPixel(hdc, centerx - 1, centery, infoPtr->clrBk);
+		    SetPixel(hdc, centerx + 1, centery, infoPtr->clrBk);
+		}
 	    }
 	}
     }
@@ -3779,7 +3825,7 @@
 {
     HWND hwnd = infoPtr->hwnd;
     TVHITTESTINFO ht;
-    BOOL bTrack;
+    BOOL bTrack, bDoLabelEdit;
     HTREEITEM tempItem;
 
     /* If Edit control is active - kill it and return.
@@ -3812,6 +3858,13 @@
     bTrack = (ht.flags & TVHT_ONITEM)
 	&& !(infoPtr->dwStyle & TVS_DISABLEDRAGDROP);
 
+    /*
+     * If the style allows editing and the node is already selected
+     * and the click occurred on the item label...
+     */
+    bDoLabelEdit = (infoPtr->dwStyle & TVS_EDITLABELS) &&
+        (ht.flags & TVHT_ONITEMLABEL) && (infoPtr->selectedItem == ht.hItem);
+
     /* Send NM_CLICK right away */
     if (!bTrack)
 	if (TREEVIEW_SendSimpleNotify(infoPtr, NM_CLICK))
@@ -3848,12 +3901,7 @@
     if (bTrack && TREEVIEW_SendSimpleNotify(infoPtr, NM_CLICK))
         goto setfocus;
 
-    /*
-     * If the style allows editing and the node is already selected
-     * and the click occurred on the item label...
-     */
-    if ((infoPtr->dwStyle & TVS_EDITLABELS) &&
-	        (ht.flags & TVHT_ONITEMLABEL) && (infoPtr->selectedItem == ht.hItem))
+    if (bDoLabelEdit)
     {
 	if (infoPtr->Timer & TV_EDIT_TIMER_SET)
 	    KillTimer(hwnd, TV_EDIT_TIMER);
@@ -4319,7 +4367,7 @@
 
     viscount = TREEVIEW_GetVisibleCount(infoPtr);
 
-    TRACE("%p (%s) %ld - %ld viscount(%d)\n", item, TREEVIEW_ItemName(item), item->visibleOrder, 
+    TRACE("%p (%s) %ld - %ld viscount(%d)\n", item, TREEVIEW_ItemName(item), item->visibleOrder,
         hasFirstVisible ? infoPtr->firstVisible->visibleOrder : -1, viscount);
 
     if (hasFirstVisible)
@@ -4667,7 +4715,7 @@
     infoPtr->treeWidth = 0;
     infoPtr->treeHeight = 0;
 
-    infoPtr->uIndent = 19;
+    infoPtr->uIndent = MINIMUM_INDENT;
     infoPtr->selectedItem = 0;
     infoPtr->focusedItem = 0;
     /* hotItem? */
@@ -4985,21 +5033,21 @@
 static INT TREEVIEW_NotifyFormat (TREEVIEW_INFO *infoPtr, HWND hwndFrom, UINT nCommand)
 {
     INT format;
-    
+
     TRACE("(hwndFrom=%p, nCommand=%d)\n", hwndFrom, nCommand);
 
     if (nCommand != NF_REQUERY) return 0;
-    
+
     format = SendMessageW(hwndFrom, WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwnd, NF_QUERY);
     TRACE("format=%d\n", format);
 
     if (format != NFR_ANSI && format != NFR_UNICODE) return 0;
-    
+
     infoPtr->bNtfUnicode = (format == NFR_UNICODE);
-    
+
     return format;
 }
-    
+
 static LRESULT
 TREEVIEW_Size(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
 {

reactos/lib/comctl32
updown.c 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- updown.c	19 Sep 2004 09:50:06 -0000	1.5
+++ updown.c	20 Oct 2004 08:36:55 -0000	1.6
@@ -511,7 +511,7 @@
             x  = budRect.right+DEFAULT_XSEP;
         }
 
-        /* first adjust the buddy to accomodate the up/down */
+        /* first adjust the buddy to accommodate the up/down */
         SetWindowPos(infoPtr->Buddy, 0, budRect.left, budRect.top,
                      budRect.right  - budRect.left, budRect.bottom - budRect.top,
                      SWP_NOACTIVATE|SWP_NOZORDER);
@@ -524,7 +524,7 @@
         /*
          * If the updown has a buddy border, it has to overlap with the buddy
          * to look as if it is integrated with the buddy control.
-         * We nudge the control or change it size to overlap.
+         * We nudge the control or change its size to overlap.
          */
         if (UPDOWN_HasBuddyBorder(infoPtr)) {
             if(dwStyle & UDS_ALIGNLEFT)

reactos/lib/comctl32
winehq2ros.patch 1.10 -> 1.11
diff -u -r1.10 -r1.11
--- winehq2ros.patch	14 Aug 2004 19:12:35 -0000	1.10
+++ winehq2ros.patch	20 Oct 2004 08:36:55 -0000	1.11
@@ -1,14 +1,17 @@
+? Makefile.ros-template
+? makefile
+? winehq2ros.patch
 Index: comctl32.spec
 ===================================================================
 RCS file: /home/wine/wine/dlls/comctl32/comctl32.spec,v
-retrieving revision 1.44
-diff -u -r1.44 comctl32.spec
---- comctl32.spec	17 May 2004 20:51:27 -0000	1.44
-+++ comctl32.spec	14 Aug 2004 19:24:23 -0000
+retrieving revision 1.46
+diff -u -r1.46 comctl32.spec
+--- comctl32.spec	19 Oct 2004 22:59:59 -0000	1.46
++++ comctl32.spec	20 Oct 2004 08:27:55 -0000
 @@ -106,13 +106,13 @@
  412 stdcall RemoveWindowSubclass(long ptr long)
  413 stdcall DefSubclassProc(long long long long)
- 414 stub -noname MirrorIcon
+ 414 stdcall -noname MirrorIcon(ptr ptr)
 -415 stdcall -noname DrawTextWrap(long wstr long ptr long) user32.DrawTextW
 -416 stdcall -noname DrawTextExPrivWrap(long wstr long ptr long ptr) user32.DrawTextExW
 -417 stdcall -noname ExtTextOutWrap(long long long long ptr wstr long ptr) gdi32.ExtTextOutW
@@ -29,10 +32,10 @@
 Index: listview.c
 ===================================================================
 RCS file: /home/wine/wine/dlls/comctl32/listview.c,v
-retrieving revision 1.392
-diff -u -r1.392 listview.c
---- listview.c	12 Aug 2004 20:01:55 -0000	1.392
-+++ listview.c	14 Aug 2004 19:24:27 -0000
+retrieving revision 1.394
+diff -u -r1.394 listview.c
+--- listview.c	2 Sep 2004 23:00:53 -0000	1.394
++++ listview.c	20 Oct 2004 08:27:58 -0000
 @@ -146,6 +146,7 @@
  #include <assert.h>
  #include <ctype.h>
@@ -64,11 +67,11 @@
 Index: string.c
 ===================================================================
 RCS file: /home/wine/wine/dlls/comctl32/string.c,v
-retrieving revision 1.4
-diff -u -r1.4 string.c
---- string.c	17 May 2004 20:51:27 -0000	1.4
-+++ string.c	14 Aug 2004 19:24:27 -0000
-@@ -254,7 +254,7 @@
+retrieving revision 1.5
+diff -u -r1.5 string.c
+--- string.c	22 Sep 2004 19:10:27 -0000	1.5
++++ string.c	20 Oct 2004 08:27:59 -0000
+@@ -264,7 +264,7 @@
  {
    TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch));
  
@@ -77,7 +80,7 @@
  }
  
  /**************************************************************************
-@@ -503,7 +503,7 @@
+@@ -513,7 +513,7 @@
  {
    TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch));
  
CVSspam 0.2.8