1diff -pudN e:\wine\dlls\comctl32/comctl32.h e:\reactos\dll\win32\comctl32/comctl32.h
2--- e:\wine\dlls\comctl32/comctl32.h	2017-09-07 12:58:14 +0100
3+++ e:\reactos\dll\win32\comctl32/comctl32.h	2017-06-15 11:36:56 +0100
4@@ -45,83 +45,15 @@
5 #include <uxtheme.h>
6 #include <vssym32.h>
7
8-#include <wine/unicode.h>
9 #include <wine/debug.h>
10+#include <wine/list.h>
11+#include <wine/unicode.h>
12
13 #include "resource.h"
14
15 extern HMODULE COMCTL32_hModule DECLSPEC_HIDDEN;
16 extern HBRUSH  COMCTL32_hPattern55AABrush DECLSPEC_HIDDEN;
17
18-/* Property sheet / Wizard */
19-#define IDD_PROPSHEET 1006
20-#define IDD_WIZARD    1020
21-
22-#define IDC_TABCONTROL   12320
23-#define IDC_APPLY_BUTTON 12321
24-#define IDC_BACK_BUTTON  12323
25-#define IDC_NEXT_BUTTON  12324
26-#define IDC_FINISH_BUTTON 12325
27-#define IDC_SUNKEN_LINE   12326
28-#define IDC_SUNKEN_LINEHEADER 12327
29-
30-#define IDS_CLOSE	  4160
31-
32-/* Toolbar customization dialog */
33-#define IDD_TBCUSTOMIZE     200
34-
35-#define IDC_AVAILBTN_LBOX   201
36-#define IDC_RESET_BTN       202
37-#define IDC_TOOLBARBTN_LBOX 203
38-#define IDC_REMOVE_BTN      204
39-#define IDC_HELP_BTN        205
40-#define IDC_MOVEUP_BTN      206
41-#define IDC_MOVEDN_BTN      207
42-
43-#define IDS_SEPARATOR      1024
44-
45-/* Toolbar imagelist bitmaps */
46-#define IDB_STD_SMALL       120
47-#define IDB_STD_LARGE       121
48-#define IDB_VIEW_SMALL      124
49-#define IDB_VIEW_LARGE      125
50-#define IDB_HIST_SMALL      130
51-#define IDB_HIST_LARGE      131
52-
53-#define IDM_TODAY                      4163
54-#define IDM_GOTODAY                    4164
55-
56-/* Treeview Checkboxes */
57-
58-#define IDT_CHECK        401
59-
60-
61-/* Cursors */
62-#define IDC_MOVEBUTTON                  102
63-#define IDC_COPY                        104
64-#define IDC_DIVIDER                     106
65-#define IDC_DIVIDEROPEN                 107
66-
67-
68-/* DragList resources */
69-#define IDI_DRAGARROW                   501
70-
71-/* HOTKEY internal strings */
72-#define HKY_NONE                        2048
73-
74-/* Tooltip icons */
75-#define IDI_TT_INFO_SM                   22
76-#define IDI_TT_WARN_SM                   25
77-#define IDI_TT_ERROR_SM                  28
78-
79-/* Taskdialog strings */
80-#define IDS_BUTTON_YES    3000
81-#define IDS_BUTTON_NO     3001
82-#define IDS_BUTTON_RETRY  3002
83-#define IDS_BUTTON_OK     3003
84-#define IDS_BUTTON_CANCEL 3004
85-#define IDS_BUTTON_CLOSE  3005
86-
87 typedef struct
88 {
89     COLORREF clrBtnHighlight;       /* COLOR_BTNHIGHLIGHT                  */
90@@ -145,6 +77,21 @@ typedef struct
91
92 extern COMCTL32_SysColor  comctl32_color DECLSPEC_HIDDEN;
93
94+typedef struct _BUTTON_DATA {
95+    LONG state;
96+    HFONT font;
97+    LONG_PTR image;
98+    DWORD ui_state;
99+
100+    RECT rcTextMargin;
101+    BUTTON_IMAGELIST imlData;
102+} BUTTON_DATA, *PBUTTON_DATA;
103+
104+static inline PBUTTON_DATA _GetButtonData(HWND hwnd)
105+{
106+    return (PBUTTON_DATA)GetWindowLongPtrW( hwnd, 0 );
107+}
108+
109 /* Internal function */
110 HWND COMCTL32_CreateToolTip (HWND) DECLSPEC_HIDDEN;
111 VOID COMCTL32_RefreshSysColors(void) DECLSPEC_HIDDEN;
112@@ -157,8 +104,6 @@ INT  Str_GetPtrAtoW (LPCSTR lpSrc, LPWST
113 BOOL Str_SetPtrAtoW (LPWSTR *lppDest, LPCSTR lpSrc) DECLSPEC_HIDDEN;
114 BOOL Str_SetPtrWtoA (LPSTR *lppDest, LPCWSTR lpSrc) DECLSPEC_HIDDEN;
115
116-#define COMCTL32_VERSION_MINOR 81
117-
118 /* Our internal stack structure of the window procedures to subclass */
119 typedef struct _SUBCLASSPROCS {
120     SUBCLASSPROC subproc;
121@@ -230,13 +175,18 @@ extern void TREEVIEW_Register(void) DECL
122 extern void TREEVIEW_Unregister(void) DECLSPEC_HIDDEN;
123 extern void UPDOWN_Register(void) DECLSPEC_HIDDEN;
124 extern void UPDOWN_Unregister(void) DECLSPEC_HIDDEN;
125-
126+extern void BUTTON_Register();
127+extern void BUTTON_Unregister();
128+#ifdef __REACTOS__
129+extern void TOOLBARv6_Register(void) DECLSPEC_HIDDEN;
130+extern void TOOLBARv6_Unregister(void) DECLSPEC_HIDDEN;
131+#endif
132
133 int MONTHCAL_MonthLength(int month, int year) DECLSPEC_HIDDEN;
134 int MONTHCAL_CalculateDayOfWeek(SYSTEMTIME *date, BOOL inplace) DECLSPEC_HIDDEN;
135 LONG MONTHCAL_CompareSystemTime(const SYSTEMTIME *first, const SYSTEMTIME *second) DECLSPEC_HIDDEN;
136
137-extern void THEMING_Initialize(void) DECLSPEC_HIDDEN;
138+extern void THEMING_Initialize(HANDLE hActCtx5, HANDLE hActCtx6) DECLSPEC_HIDDEN;
139 extern void THEMING_Uninitialize(void) DECLSPEC_HIDDEN;
140 extern LRESULT THEMING_CallOriginalClass(HWND, UINT, WPARAM, LPARAM) DECLSPEC_HIDDEN;
141 extern void THEMING_SetSubclassData(HWND, ULONG_PTR) DECLSPEC_HIDDEN;
142diff -pudN e:\wine\dlls\comctl32/commctrl.c e:\reactos\dll\win32\comctl32/commctrl.c
143--- e:\wine\dlls\comctl32/commctrl.c	2017-09-07 12:58:14 +0100
144+++ e:\reactos\dll\win32\comctl32/commctrl.c	2017-08-17 11:24:56 +0100
145@@ -3,7 +3,7 @@
146  *
147  * Copyright 1997 Dimitrie O. Paun
148  * Copyright 1998,2000 Eric Kohl
149- * Copyright 2014-2015 Michael Müller
150+ * Copyright 2014-2015 Michael M�ller
151  *
152  * This library is free software; you can redistribute it and/or
153  * modify it under the terms of the GNU Lesser General Public
154@@ -81,6 +81,259 @@ static const WCHAR strCC32SubclassInfo[]
155     'C','C','3','2','S','u','b','c','l','a','s','s','I','n','f','o',0
156 };
157
158+#ifdef __REACTOS__
159+
160+#include <strsafe.h>
161+
162+#define NAME       L"microsoft.windows.common-controls"
163+#define VERSION_V5 L"5.82.2600.2982"
164+#define VERSION    L"6.0.2600.2982"
165+#define PUBLIC_KEY L"6595b64144ccf1df"
166+
167+#ifdef __i386__
168+#define ARCH L"x86"
169+#elif defined __x86_64__
170+#define ARCH L"amd64"
171+#else
172+#define ARCH L"none"
173+#endif
174+
175+static const WCHAR manifest_filename[] = ARCH L"_" NAME L"_" PUBLIC_KEY L"_" VERSION L"_none_deadbeef.manifest";
176+static const WCHAR manifest_filename_v5[] = ARCH L"_" NAME L"_" PUBLIC_KEY L"_" VERSION_V5 L"_none_deadbeef.manifest";
177+
178+static WCHAR* GetManifestPath(BOOL create, BOOL bV6)
179+{
180+    WCHAR *pwszBuf;
181+    HRESULT hres;
182+
183+    pwszBuf = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR));
184+    if (!pwszBuf)
185+        return NULL;
186+
187+    GetWindowsDirectoryW(pwszBuf, MAX_PATH);
188+    hres = StringCchCatW(pwszBuf, MAX_PATH, L"\\winsxs");
189+    if (FAILED(hres))
190+        return NULL;
191+    if (create)
192+        CreateDirectoryW(pwszBuf, NULL);
193+    hres = StringCchCatW(pwszBuf, MAX_PATH, L"\\manifests\\");
194+    if (FAILED(hres))
195+        return NULL;
196+    if (create)
197+        CreateDirectoryW(pwszBuf, NULL);
198+
199+    hres = StringCchCatW(pwszBuf, MAX_PATH, bV6 ? manifest_filename : manifest_filename_v5);
200+    if (FAILED(hres))
201+        return NULL;
202+
203+    return pwszBuf;
204+}
205+
206+static BOOL create_manifest(BOOL install, BOOL bV6)
207+{
208+    WCHAR *pwszBuf;
209+    HRSRC hResInfo;
210+    HGLOBAL hResData;
211+    PVOID pManifest;
212+    DWORD cbManifest, cbWritten;
213+    HANDLE hFile;
214+    BOOL bRet = FALSE;
215+
216+    if (bV6)
217+        hResInfo = FindResourceW(COMCTL32_hModule, L"WINE_MANIFEST", (LPWSTR)RT_MANIFEST);
218+    else
219+        hResInfo = FindResourceW(COMCTL32_hModule, L"WINE_MANIFESTV5", (LPWSTR)RT_MANIFEST);
220+
221+    if (!hResInfo)
222+        return FALSE;
223+
224+    cbManifest = SizeofResource(COMCTL32_hModule, hResInfo);
225+    if (!cbManifest)
226+        return FALSE;
227+
228+    hResData = LoadResource(COMCTL32_hModule, hResInfo);
229+    if (!hResData)
230+        return FALSE;
231+
232+    pManifest = LockResource(hResData);
233+    if (!pManifest)
234+        return FALSE;
235+
236+    pwszBuf = GetManifestPath(TRUE, bV6);
237+    if (!pwszBuf)
238+        return FALSE;
239+
240+    if (install)
241+    {
242+        hFile = CreateFileW(pwszBuf, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
243+        if (hFile != INVALID_HANDLE_VALUE)
244+        {
245+            if (WriteFile(hFile, pManifest, cbManifest, &cbWritten, NULL) && cbWritten == cbManifest)
246+                bRet = TRUE;
247+
248+            CloseHandle(hFile);
249+
250+            if (!bRet)
251+                DeleteFileW(pwszBuf);
252+            else
253+                TRACE("created %s\n", debugstr_w(pwszBuf));
254+        }
255+    }
256+    else
257+        bRet = DeleteFileW(pwszBuf);
258+
259+    HeapFree(GetProcessHeap(), 0, pwszBuf);
260+
261+    return bRet;
262+}
263+
264+static HANDLE CreateComctl32ActCtx(BOOL bV6)
265+{
266+    HANDLE ret;
267+    WCHAR* pwstrSource;
268+    ACTCTXW ActCtx = {sizeof(ACTCTX)};
269+
270+    pwstrSource = GetManifestPath(FALSE, bV6);
271+    if (!pwstrSource)
272+    {
273+        ERR("GetManifestPath failed! bV6=%d\n", bV6);
274+        return INVALID_HANDLE_VALUE;
275+    }
276+    ActCtx.lpSource = pwstrSource;
277+    ret = CreateActCtxW(&ActCtx);
278+    HeapFree(GetProcessHeap(), 0, pwstrSource);
279+    if (ret == INVALID_HANDLE_VALUE)
280+        ERR("CreateActCtxW failed! bV6=%d\n", bV6);
281+    return ret;
282+}
283+
284+static void RegisterControls(BOOL bV6)
285+{
286+    ANIMATE_Register ();
287+    COMBOEX_Register ();
288+    DATETIME_Register ();
289+    FLATSB_Register ();
290+    HEADER_Register ();
291+    HOTKEY_Register ();
292+    IPADDRESS_Register ();
293+    LISTVIEW_Register ();
294+    MONTHCAL_Register ();
295+    NATIVEFONT_Register ();
296+    PAGER_Register ();
297+    PROGRESS_Register ();
298+    REBAR_Register ();
299+    STATUS_Register ();
300+    SYSLINK_Register ();
301+    TAB_Register ();
302+    TOOLTIPS_Register ();
303+    TRACKBAR_Register ();
304+    TREEVIEW_Register ();
305+    UPDOWN_Register ();
306+
307+    if (!bV6)
308+    {
309+        TOOLBAR_Register ();
310+    }
311+    else
312+    {
313+        BUTTON_Register();
314+        TOOLBARv6_Register();
315+    }
316+}
317+
318+static void UnregisterControls(BOOL bV6)
319+{
320+    ANIMATE_Unregister ();
321+    COMBOEX_Unregister ();
322+    DATETIME_Unregister ();
323+    FLATSB_Unregister ();
324+    HEADER_Unregister ();
325+    HOTKEY_Unregister ();
326+    IPADDRESS_Unregister ();
327+    LISTVIEW_Unregister ();
328+    MONTHCAL_Unregister ();
329+    NATIVEFONT_Unregister ();
330+    PAGER_Unregister ();
331+    PROGRESS_Unregister ();
332+    REBAR_Unregister ();
333+    STATUS_Unregister ();
334+    SYSLINK_Unregister ();
335+    TAB_Unregister ();
336+    TOOLTIPS_Unregister ();
337+    TRACKBAR_Unregister ();
338+    TREEVIEW_Unregister ();
339+    UPDOWN_Unregister ();
340+
341+    if (!bV6)
342+    {
343+        TOOLBAR_Unregister ();
344+    }
345+    else
346+    {
347+        BUTTON_Unregister();
348+        TOOLBARv6_Unregister ();
349+    }
350+
351+}
352+
353+static void InitializeClasses()
354+{
355+    HANDLE hActCtx5, hActCtx6;
356+    BOOL activated;
357+    ULONG_PTR ulCookie;
358+
359+    /* like comctl32 5.82+ register all the common control classes */
360+    /* Register the classes once no matter what */
361+    hActCtx5 = CreateComctl32ActCtx(FALSE);
362+    activated = (hActCtx5 != INVALID_HANDLE_VALUE ? ActivateActCtx(hActCtx5, &ulCookie) : FALSE);
363+    RegisterControls(FALSE);      /* Register the classes pretending to be v5 */
364+    if (activated) DeactivateActCtx(0, ulCookie);
365+
366+    hActCtx6 = CreateComctl32ActCtx(TRUE);
367+    if (hActCtx6 != INVALID_HANDLE_VALUE)
368+    {
369+        activated = ActivateActCtx(hActCtx6, &ulCookie);
370+        RegisterControls(TRUE);      /* Register the classes pretending to be v6 */
371+        if (activated) DeactivateActCtx(0, ulCookie);
372+
373+        /* Initialize the themed controls only when the v6 manifest is present */
374+        THEMING_Initialize (hActCtx5, hActCtx6);
375+    }
376+}
377+
378+static void UninitializeClasses()
379+{
380+    HANDLE hActCtx5, hActCtx6;
381+    BOOL activated;
382+    ULONG_PTR ulCookie;
383+
384+    hActCtx5 = CreateComctl32ActCtx(FALSE);
385+    activated = (hActCtx5 != INVALID_HANDLE_VALUE ? ActivateActCtx(hActCtx5, &ulCookie) : FALSE);
386+    UnregisterControls(FALSE);
387+    if (activated) DeactivateActCtx(0, ulCookie);
388+
389+    hActCtx6 = CreateComctl32ActCtx(TRUE);
390+    if (hActCtx6 != INVALID_HANDLE_VALUE)
391+    {
392+        activated = ActivateActCtx(hActCtx6, &ulCookie);
393+        THEMING_Uninitialize();
394+        UnregisterControls(TRUE);
395+        if (activated) DeactivateActCtx(0, ulCookie);
396+    }
397+}
398+
399+/***********************************************************************
400+ * RegisterClassNameW [COMCTL32.@]
401+ *
402+ * Register window class again while using as SxS module.
403+ */
404+BOOLEAN WINAPI RegisterClassNameW(LPCWSTR className)
405+{
406+    InitializeClasses();
407+    return TRUE;
408+}
409+
410+#endif
411
412 /***********************************************************************
413  * DllMain [Internal]
414@@ -118,6 +371,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL,
415 	    /* Get all the colors at DLL load */
416 	    COMCTL32_RefreshSysColors();
417
418+#ifndef __REACTOS__
419             /* like comctl32 5.82+ register all the common control classes */
420             ANIMATE_Register ();
421             COMBOEX_Register ();
422@@ -143,10 +397,15 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL,
423
424             /* subclass user32 controls */
425             THEMING_Initialize ();
426+#else
427+            InitializeClasses();
428+#endif
429+
430             break;
431
432 	case DLL_PROCESS_DETACH:
433             if (lpvReserved) break;
434+#ifndef __REACTOS__
435             /* clean up subclassing */
436             THEMING_Uninitialize();
437
438@@ -172,7 +431,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL,
439             TRACKBAR_Unregister ();
440             TREEVIEW_Unregister ();
441             UPDOWN_Unregister ();
442-
443+#else
444+            UninitializeClasses();
445+#endif
446             /* delete local pattern brush */
447             DeleteObject (COMCTL32_hPattern55AABrush);
448             DeleteObject (COMCTL32_hPattern55AABitmap);
449@@ -917,6 +1178,22 @@ HRESULT WINAPI DllGetVersion (DLLVERSION
450 HRESULT WINAPI DllInstall(BOOL bInstall, LPCWSTR cmdline)
451 {
452     TRACE("(%u, %s): stub\n", bInstall, debugstr_w(cmdline));
453+
454+#ifdef __REACTOS__
455+
456+    if (!create_manifest(bInstall, TRUE))
457+    {
458+        ERR("Failed to install comctl32 v6 manifest!\n");
459+        return HRESULT_FROM_WIN32(GetLastError());
460+    }
461+
462+    if (!create_manifest(bInstall, FALSE))
463+    {
464+        ERR("Failed to install comctl32 v5 manifest!\n");
465+        return HRESULT_FROM_WIN32(GetLastError());
466+    }
467+#endif
468+
469     return S_OK;
470 }
471
472@@ -1580,33 +1857,113 @@ LRESULT WINAPI SetPathWordBreakProc(HWND
473  *
474  * Draw text with shadow.
475  */
476-int WINAPI DrawShadowText(HDC hdc, LPCWSTR text, UINT length, RECT *rect, DWORD flags,
477-                          COLORREF crText, COLORREF crShadow, int offset_x, int offset_y)
478+int WINAPI DrawShadowText(HDC hdc, LPCWSTR pszText, UINT cch, RECT *prc, DWORD dwFlags,
479+                          COLORREF crText, COLORREF crShadow, int ixOffset, int iyOffset)
480 {
481-    int bkmode, ret;
482-    COLORREF clr;
483-    RECT r;
484+    COLORREF crOldText;
485+    RECT rcText;
486+    INT iRet, x, y, x2, y2;
487+    BYTE *pBits;
488+    HBITMAP hbm, hbmOld;
489+    BITMAPINFO bi;
490+    HDC hdcMem;
491+    HFONT hOldFont;
492+    BLENDFUNCTION bf;
493
494-    FIXME("(%p, %s, %d, %p, 0x%08x, 0x%08x, 0x%08x, %d, %d): semi-stub\n", hdc, debugstr_w(text),
495-        length, rect, flags, crText, crShadow, offset_x, offset_y);
496+    /* Create 32 bit DIB section for the shadow */
497+    ZeroMemory(&bi, sizeof(bi));
498+    bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
499+    bi.bmiHeader.biWidth = prc->right - prc->left + 4;
500+    bi.bmiHeader.biHeight = prc->bottom - prc->top + 5; // bottom-up DIB
501+    bi.bmiHeader.biPlanes = 1;
502+    bi.bmiHeader.biBitCount = 32;
503+    bi.bmiHeader.biCompression = BI_RGB;
504+    hbm = CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, (PVOID*)&pBits, NULL, 0);
505+    if(!hbm)
506+    {
507+        ERR("CreateDIBSection failed\n");
508+        return 0;
509+    }
510
511-    bkmode = SetBkMode(hdc, TRANSPARENT);
512-    clr = SetTextColor(hdc, crShadow);
513+    /* Create memory device context for new DIB section and select it */
514+    hdcMem = CreateCompatibleDC(hdc);
515+    if(!hdcMem)
516+    {
517+        ERR("CreateCompatibleDC failed\n");
518+        DeleteObject(hbm);
519
520+        return 0;
521+    }
522
523-    /* FIXME: for shadow we need to render normally, blur it, and blend with current background. */
524-    r = *rect;
525-    OffsetRect(&r, 1, 1);
526-    DrawTextW(hdc, text, length, &r, flags);
527+    hbmOld = (HBITMAP)SelectObject(hdcMem, hbm);
528
529-    SetTextColor(hdc, crText);
530+    /* Draw text on our helper bitmap */
531+    hOldFont = (HFONT)SelectObject(hdcMem, GetCurrentObject(hdc, OBJ_FONT));
532+    SetTextColor(hdcMem, RGB(16, 16, 16));
533+    SetBkColor(hdcMem, RGB(0, 0, 0));
534+    SetBkMode(hdcMem, TRANSPARENT);
535+    SetRect(&rcText, 0, 0, prc->right - prc->left, prc->bottom - prc->top);
536+    DrawTextW(hdcMem, pszText, cch, &rcText, dwFlags);
537+    SelectObject(hdcMem, hOldFont);
538
539-    /* with text color on top of a shadow */
540-    ret = DrawTextW(hdc, text, length, rect, flags);
541+    /* Flush GDI so data pointed by pBits is valid */
542+    GdiFlush();
543
544-    SetTextColor(hdc, clr);
545-    SetBkMode(hdc, bkmode);
546+    /* Set alpha of pixels (forget about colors for now. They will be changed in next loop).
547+       We copy text image 4*5 times and each time alpha is added */
548+    for (x = 0; x < bi.bmiHeader.biWidth; ++x)
549+        for (y = 0; y < bi.bmiHeader.biHeight; ++y)
550+        {
551+            BYTE *pDest = &pBits[(y * bi.bmiHeader.biWidth + x) * 4];
552+            UINT Alpha = 0;
553
554-    return ret;
555+            for (x2 = x - 4 + 1; x2 <= x; ++x2)
556+                for (y2 = y; y2 < y + 5; ++y2)
557+                {
558+                    if (x2 >= 0 && x2 < bi.bmiHeader.biWidth && y2 >= 0 && y2 < bi.bmiHeader.biHeight)
559+                    {
560+                        BYTE *pSrc = &pBits[(y2 * bi.bmiHeader.biWidth + x2) * 4];
561+                        Alpha += pSrc[0];
562+                    }
563+                }
564+
565+            if (Alpha > 255)
566+                Alpha = 255;
567+            pDest[3] = Alpha;
568+        }
569+
570+    /* Now set the color of each pixel to shadow color * alpha (see GdiAlphaBlend) */
571+    for (x = 0; x < bi.bmiHeader.biWidth; ++x)
572+        for (y = 0; y < bi.bmiHeader.biHeight; ++y)
573+        {
574+            BYTE *pDest = &pBits[(y * bi.bmiHeader.biWidth + x) * 4];
575+            pDest[0] = GetBValue(crShadow) * pDest[3] / 255;
576+            pDest[1] = GetGValue(crShadow) * pDest[3] / 255;
577+            pDest[2] = GetRValue(crShadow) * pDest[3] / 255;
578+        }
579+
580+    /* Fix ixOffset of the shadow (tested on Win) */
581+    ixOffset -= 3;
582+    iyOffset -= 3;
583+
584+    /* Alpha blend helper image to destination DC */
585+    bf.BlendOp = AC_SRC_OVER;
586+    bf.BlendFlags = 0;
587+    bf.SourceConstantAlpha = 255;
588+    bf.AlphaFormat = AC_SRC_ALPHA;
589+    GdiAlphaBlend(hdc, prc->left + ixOffset, prc->top + iyOffset, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight, hdcMem, 0, 0, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight, bf);
590+
591+    /* Delete the helper bitmap */
592+    SelectObject(hdcMem, hbmOld);
593+    DeleteObject(hbm);
594+    DeleteDC(hdcMem);
595+
596+    /* Finally draw the text over shadow */
597+    crOldText = SetTextColor(hdc, crText);
598+    SetBkMode(hdc, TRANSPARENT);
599+    iRet = DrawTextW(hdc, pszText, cch, prc, dwFlags);
600+    SetTextColor(hdc, crOldText);
601+
602+    return iRet;
603 }
604
605 /***********************************************************************
606diff -pudN e:\wine\dlls\comctl32/imagelist.c e:\reactos\dll\win32\comctl32/imagelist.c
607--- e:\wine\dlls\comctl32/imagelist.c	2017-09-07 12:58:14 +0100
608+++ e:\reactos\dll\win32\comctl32/imagelist.c	2017-05-07 14:47:57 +0100
609@@ -33,7 +33,7 @@
610  *
611  *  TODO:
612  *    - Add support for ILD_PRESERVEALPHA, ILD_SCALE, ILD_DPISCALE
613- *    - Add support for ILS_GLOW, ILS_SHADOW, ILS_SATURATE
614+ *    - Add support for ILS_GLOW, ILS_SHADOW
615  *    - Thread-safe locking
616  */
617
618@@ -1243,8 +1243,11 @@ ImageList_DrawEx (HIMAGELIST himl, INT i
619     return ImageList_DrawIndirect (&imldp);
620 }
621
622-
623+#ifdef __REACTOS__
624+static BOOL alpha_blend_image( HIMAGELIST himl, HDC srce_dc, HDC dest_dc, int dest_x, int dest_y,
625+#else
626 static BOOL alpha_blend_image( HIMAGELIST himl, HDC dest_dc, int dest_x, int dest_y,
627+#endif
628                                int src_x, int src_y, int cx, int cy, BLENDFUNCTION func,
629                                UINT style, COLORREF blend_col )
630 {
631@@ -1269,9 +1272,17 @@ static BOOL alpha_blend_image( HIMAGELIS
632     info->bmiHeader.biYPelsPerMeter = 0;
633     info->bmiHeader.biClrUsed = 0;
634     info->bmiHeader.biClrImportant = 0;
635+#ifdef __REACTOS__
636+    if (!(bmp = CreateDIBSection( srce_dc, info, DIB_RGB_COLORS, &bits, 0, 0 ))) goto done;
637+#else
638     if (!(bmp = CreateDIBSection( himl->hdcImage, info, DIB_RGB_COLORS, &bits, 0, 0 ))) goto done;
639+#endif
640     SelectObject( hdc, bmp );
641+#ifdef __REACTOS__
642+    BitBlt( hdc, 0, 0, cx, cy, srce_dc, src_x, src_y, SRCCOPY );
643+#else
644     BitBlt( hdc, 0, 0, cx, cy, himl->hdcImage, src_x, src_y, SRCCOPY );
645+#endif
646
647     if (blend_col != CLR_NONE)
648     {
649@@ -1344,6 +1355,68 @@ done:
650     return ret;
651 }
652
653+#ifdef __REACTOS__
654+HDC saturate_image( HIMAGELIST himl, HDC dest_dc, int dest_x, int dest_y,
655+                    int src_x, int src_y, int cx, int cy, COLORREF rgbFg)
656+{
657+    HDC hdc = NULL;
658+    HBITMAP bmp = 0;
659+    BITMAPINFO *info;
660+
661+    unsigned int *ptr;
662+    void *bits;
663+    int i;
664+
665+    /* create a dc and its device independent bitmap for doing the work,
666+       shamelessly copied from the alpha-blending function above */
667+    if (!(hdc = CreateCompatibleDC( 0 ))) return FALSE;
668+    if (!(info = HeapAlloc( GetProcessHeap(), 0, FIELD_OFFSET( BITMAPINFO, bmiColors[256] )))) goto done;
669+    info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
670+    info->bmiHeader.biWidth = cx;
671+    info->bmiHeader.biHeight = cy;
672+    info->bmiHeader.biPlanes = 1;
673+    info->bmiHeader.biBitCount = 32;
674+    info->bmiHeader.biCompression = BI_RGB;
675+    info->bmiHeader.biSizeImage = cx * cy * 4;
676+    info->bmiHeader.biXPelsPerMeter = 0;
677+    info->bmiHeader.biYPelsPerMeter = 0;
678+    info->bmiHeader.biClrUsed = 0;
679+    info->bmiHeader.biClrImportant = 0;
680+    if (!(bmp = CreateDIBSection(himl->hdcImage, info, DIB_RGB_COLORS, &bits, 0, 0 ))) goto done;
681+
682+    /* bind both surfaces */
683+    SelectObject(hdc, bmp);
684+
685+    /* copy into our dc the section that covers just the icon we we're asked for */
686+    BitBlt(hdc, 0, 0, cx, cy, himl->hdcImage, src_x, src_y, SRCCOPY);
687+
688+    /* loop every pixel of the bitmap */
689+    for (i = 0, ptr = bits; i < cx * cy; i++, ptr++)
690+    {
691+        COLORREF orig_color = *ptr;
692+
693+        /* calculate the effective luminance using the constants from here, adapted to the human eye:
694+           <http://bobpowell.net/grayscale.aspx> */
695+        float mixed_color = (GetRValue(orig_color) * .30 +
696+                             GetGValue(orig_color) * .59 +
697+                             GetBValue(orig_color) * .11);
698+
699+        *ptr = RGBA(mixed_color, mixed_color, mixed_color, GetAValue(orig_color));
700+    }
701+
702+done:
703+
704+    if (bmp)
705+        DeleteObject(bmp);
706+
707+    if (info)
708+        HeapFree(GetProcessHeap(), 0, info);
709+
710+    /* return the handle to our desaturated dc, that will substitute its original counterpart in the next calls */
711+    return hdc;
712+}
713+#endif /* __REACTOS__ */
714+
715 /*************************************************************************
716  * ImageList_DrawIndirect [COMCTL32.@]
717  *
718@@ -1371,6 +1444,9 @@ ImageList_DrawIndirect (IMAGELISTDRAWPAR
719     HBRUSH hOldBrush;
720     POINT pt;
721     BOOL has_alpha;
722+#ifdef __REACTOS__
723+    HDC hdcSaturated = NULL;
724+#endif
725
726     if (!pimldp || !(himl = pimldp->himl)) return FALSE;
727     if (!is_valid(himl)) return FALSE;
728@@ -1420,6 +1496,24 @@ ImageList_DrawIndirect (IMAGELISTDRAWPAR
729     oldImageFg = SetTextColor( hImageDC, RGB( 0, 0, 0 ) );
730     oldImageBk = SetBkColor( hImageDC, RGB( 0xff, 0xff, 0xff ) );
731
732+#ifdef __REACTOS__
733+    /*
734+     * If the ILS_SATURATE bit is enabled we should multiply the
735+     * RGB colors of the original image by the contents of rgbFg.
736+     */
737+    if (fState & ILS_SATURATE)
738+    {
739+        hdcSaturated = saturate_image(himl, pimldp->hdcDst, pimldp->x, pimldp->y,
740+                                      pt.x, pt.y, cx, cy, pimldp->rgbFg);
741+
742+        hImageListDC = hdcSaturated;
743+        /* shitty way of getting subroutines to blit at the right place (top left corner),
744+           as our modified imagelist only contains a single image for performance reasons */
745+        pt.x = 0;
746+        pt.y = 0;
747+    }
748+#endif
749+
750     has_alpha = (himl->has_alpha && himl->has_alpha[pimldp->i]);
751     if (!bMask && (has_alpha || (fState & ILS_ALPHA)))
752     {
753@@ -1440,7 +1534,11 @@ ImageList_DrawIndirect (IMAGELISTDRAWPAR
754
755         if (bIsTransparent)
756         {
757+#ifdef __REACTOS__
758+            bResult = alpha_blend_image( himl, hImageListDC, pimldp->hdcDst, pimldp->x, pimldp->y,
759+#else
760             bResult = alpha_blend_image( himl, pimldp->hdcDst, pimldp->x, pimldp->y,
761+#endif
762                                          pt.x, pt.y, cx, cy, func, fStyle, blend_col );
763             goto end;
764         }
765@@ -1450,7 +1548,11 @@ ImageList_DrawIndirect (IMAGELISTDRAWPAR
766
767         hOldBrush = SelectObject (hImageDC, CreateSolidBrush (colour));
768         PatBlt( hImageDC, 0, 0, cx, cy, PATCOPY );
769+#ifdef __REACTOS__
770+        alpha_blend_image( himl, hImageListDC, hImageDC, 0, 0, pt.x, pt.y, cx, cy, func, fStyle, blend_col );
771+#else
772         alpha_blend_image( himl, hImageDC, 0, 0, pt.x, pt.y, cx, cy, func, fStyle, blend_col );
773+#endif
774         DeleteObject (SelectObject (hImageDC, hOldBrush));
775         bResult = BitBlt( pimldp->hdcDst, pimldp->x,  pimldp->y, cx, cy, hImageDC, 0, 0, SRCCOPY );
776         goto end;
777@@ -1544,7 +1646,9 @@ ImageList_DrawIndirect (IMAGELISTDRAWPAR
778 	}
779     }
780
781+#ifndef __REACTOS__
782     if (fState & ILS_SATURATE) FIXME("ILS_SATURATE: unimplemented!\n");
783+#endif
784     if (fState & ILS_GLOW) FIXME("ILS_GLOW: unimplemented!\n");
785     if (fState & ILS_SHADOW) FIXME("ILS_SHADOW: unimplemented!\n");
786
787@@ -1572,6 +1676,10 @@ end:
788     SetTextColor(hImageDC, oldImageFg);
789     SelectObject(hImageDC, hOldImageBmp);
790 cleanup:
791+#ifdef __REACTOS__
792+    if (hdcSaturated)
793+        DeleteDC(hdcSaturated);
794+#endif
795     DeleteObject(hBlendMaskBmp);
796     DeleteObject(hImageBmp);
797     DeleteDC(hImageDC);
798Common subdirectories: e:\wine\dlls\comctl32/lang and e:\reactos\dll\win32\comctl32/lang
799diff -pudN e:\wine\dlls\comctl32/listview.c e:\reactos\dll\win32\comctl32/listview.c
800--- e:\wine\dlls\comctl32/listview.c	2017-09-07 12:58:14 +0100
801+++ e:\reactos\dll\win32\comctl32/listview.c	2017-08-04 10:38:09 +0100
802@@ -286,6 +286,9 @@ typedef struct tagLISTVIEW_INFO
803   COLORREF clrBk;
804   COLORREF clrText;
805   COLORREF clrTextBk;
806+#ifdef __REACTOS__
807+  BOOL bDefaultBkColor;
808+#endif
809
810   /* font */
811   HFONT hDefaultFont;
812@@ -1695,8 +1698,24 @@ static inline BOOL LISTVIEW_GetItemW(con
813 /* used to handle collapse main item column case */
814 static inline BOOL LISTVIEW_DrawFocusRect(const LISTVIEW_INFO *infoPtr, HDC hdc)
815 {
816+#ifdef __REACTOS__
817+    BOOL Ret = FALSE;
818+
819+    if (infoPtr->rcFocus.left < infoPtr->rcFocus.right)
820+    {
821+        DWORD dwOldBkColor, dwOldTextColor;
822+
823+        dwOldBkColor = SetBkColor(hdc, RGB(255, 255, 255));
824+        dwOldTextColor = SetBkColor(hdc, RGB(0, 0, 0));
825+        Ret = DrawFocusRect(hdc, &infoPtr->rcFocus);
826+        SetBkColor(hdc, dwOldBkColor);
827+        SetBkColor(hdc, dwOldTextColor);
828+    }
829+    return Ret;
830+#else
831     return (infoPtr->rcFocus.left < infoPtr->rcFocus.right) ?
832             DrawFocusRect(hdc, &infoPtr->rcFocus) : FALSE;
833+#endif
834 }
835
836 /* Listview invalidation functions: use _only_ these functions to invalidate */
837@@ -2202,8 +2221,9 @@ static void LISTVIEW_ShowFocusRect(const
838 	SelectObject(hdc, hOldFont);
839     }
840     else
841-        LISTVIEW_InvalidateItem(infoPtr, infoPtr->nFocusedItem);
842-
843+    {
844+	LISTVIEW_DrawFocusRect(infoPtr, hdc);
845+    }
846 done:
847     ReleaseDC(infoPtr->hwndSelf, hdc);
848 }
849@@ -4707,7 +4727,12 @@ static void LISTVIEW_DrawItemPart(LISTVI
850     if (infoPtr->uView == LV_VIEW_DETAILS && infoPtr->dwLvExStyle & LVS_EX_GRIDLINES)
851         rcLabel.bottom--;
852
853-    DrawTextW(nmlvcd->nmcd.hdc, item->pszText, -1, &rcLabel, format);
854+#ifdef __REACTOS__
855+    if ((!(item->state & LVIS_SELECTED) || !infoPtr->bFocus) && (infoPtr->dwLvExStyle & LVS_EX_TRANSPARENTSHADOWTEXT))
856+        DrawShadowText(nmlvcd->nmcd.hdc, item->pszText, -1, &rcLabel, format, RGB(255, 255, 255), RGB(0, 0, 0), 2, 2);
857+    else
858+#endif
859+        DrawTextW(nmlvcd->nmcd.hdc, item->pszText, -1, &rcLabel, format);
860 }
861
862 /***
863@@ -5251,7 +5276,11 @@ enddraw:
864
865     /* Draw marquee rectangle if appropriate */
866     if (infoPtr->bMarqueeSelect)
867+    {
868+        SetBkColor(hdc, RGB(255, 255, 255));
869+        SetTextColor(hdc, RGB(0, 0, 0));
870         DrawFocusRect(hdc, &infoPtr->marqueeDrawRect);
871+    }
872
873     if (cdmode & CDRF_NOTIFYPOSTPAINT)
874 	notify_postpaint(infoPtr, &nmlvcd);
875@@ -8056,6 +8085,9 @@ static BOOL LISTVIEW_SetBkColor(LISTVIEW
876 {
877     TRACE("(color=%x)\n", color);
878
879+#ifdef __REACTOS__
880+    infoPtr->bDefaultBkColor = FALSE;
881+#endif
882     if(infoPtr->clrBk != color) {
883 	if (infoPtr->clrBk != CLR_NONE) DeleteObject(infoPtr->hBkBrush);
884 	infoPtr->clrBk = color;
885@@ -8731,7 +8763,7 @@ static DWORD LISTVIEW_SetIconSpacing(LIS
886     return oldspacing;
887 }
888
889-static inline void set_icon_size(SIZE *size, HIMAGELIST himl, BOOL small)
890+static inline void set_icon_size(SIZE *size, HIMAGELIST himl, BOOL is_small)
891 {
892     INT cx, cy;
893
894@@ -8742,8 +8774,8 @@ static inline void set_icon_size(SIZE *s
895     }
896     else
897     {
898-	size->cx = GetSystemMetrics(small ? SM_CXSMICON : SM_CXICON);
899-	size->cy = GetSystemMetrics(small ? SM_CYSMICON : SM_CYICON);
900+	size->cx = GetSystemMetrics(is_small ? SM_CXSMICON : SM_CXICON);
901+	size->cy = GetSystemMetrics(is_small ? SM_CYSMICON : SM_CYICON);
902     }
903 }
904
905@@ -9477,6 +9509,9 @@ static LRESULT LISTVIEW_NCCreate(HWND hw
906   infoPtr->clrText = CLR_DEFAULT;
907   infoPtr->clrTextBk = CLR_DEFAULT;
908   LISTVIEW_SetBkColor(infoPtr, comctl32_color.clrWindow);
909+#ifdef __REACTOS__
910+  infoPtr->bDefaultBkColor = TRUE;
911+#endif
912
913   /* set default values */
914   infoPtr->nFocusedItem = -1;
915@@ -10622,8 +10657,15 @@ static BOOL LISTVIEW_NCPaint(const LISTV
916         CombineRgn (cliprgn, cliprgn, region, RGN_AND);
917     OffsetRect(&r, -r.left, -r.top);
918
919+#ifdef __REACTOS__ /* r73789 */
920+    dc = GetWindowDC(infoPtr->hwndSelf);
921+    /* Exclude client part */
922+    ExcludeClipRect(dc, r.left + cxEdge, r.top + cyEdge,
923+        r.right - cxEdge, r.bottom -cyEdge);
924+#else
925     dc = GetDCEx(infoPtr->hwndSelf, region, DCX_WINDOW|DCX_INTERSECTRGN);
926     OffsetRect(&r, -r.left, -r.top);
927+#endif
928
929     if (IsThemeBackgroundPartiallyTransparent (theme, 0, 0))
930         DrawThemeParentBackground(infoPtr->hwndSelf, dc, &r);
931@@ -11761,6 +11803,14 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg
932
933   case WM_SYSCOLORCHANGE:
934     COMCTL32_RefreshSysColors();
935+#ifdef __REACTOS__
936+    if (infoPtr->bDefaultBkColor)
937+    {
938+        LISTVIEW_SetBkColor(infoPtr, comctl32_color.clrWindow);
939+        infoPtr->bDefaultBkColor = TRUE;
940+        LISTVIEW_InvalidateList(infoPtr);
941+    }
942+#endif
943     return 0;
944
945 /*	case WM_TIMER: */
946diff -pudN e:\wine\dlls\comctl32/monthcal.c e:\reactos\dll\win32\comctl32/monthcal.c
947--- e:\wine\dlls\comctl32/monthcal.c	2017-09-07 12:58:14 +0100
948+++ e:\reactos\dll\win32\comctl32/monthcal.c	2017-09-07 13:07:02 +0100
949@@ -43,6 +43,9 @@
950
951 WINE_DEFAULT_DEBUG_CHANNEL(monthcal);
952
953+/* FIXME: Inspect */
954+#define MCS_NOSELCHANGEONNAV 0x0100
955+
956 #define MC_SEL_LBUTUP	    1	/* Left button released */
957 #define MC_SEL_LBUTDOWN	    2	/* Left button pressed in calendar */
958 #define MC_PREVPRESSED      4   /* Prev month button pressed */
959diff -pudN e:\wine\dlls\comctl32/propsheet.c e:\reactos\dll\win32\comctl32/propsheet.c
960--- e:\wine\dlls\comctl32/propsheet.c	2017-09-07 12:58:14 +0100
961+++ e:\reactos\dll\win32\comctl32/propsheet.c	2017-05-21 20:32:06 +0100
962@@ -1176,8 +1176,13 @@ PROPSHEET_WizardSubclassProc(HWND hwnd,
963       return TRUE;
964
965     case WM_CTLCOLORSTATIC:
966+#ifdef __REACTOS__
967+      SetBkMode((HDC)wParam, TRANSPARENT);
968+      return (INT_PTR)GetStockObject(HOLLOW_BRUSH);
969+#else
970       SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW));
971       return (INT_PTR)GetSysColorBrush(COLOR_WINDOW);
972+#endif
973   }
974
975   return DefSubclassProc(hwnd, uMsg, wParam, lParam);
976@@ -2440,12 +2445,19 @@ static void PROPSHEET_SetWizButtons(HWND
977   HWND hwndFinish = GetDlgItem(hwndDlg, IDC_FINISH_BUTTON);
978   BOOL enable_finish = ((dwFlags & PSWIZB_FINISH) || psInfo->hasFinish) && !(dwFlags & PSWIZB_DISABLEDFINISH);
979
980+#ifdef __REACTOS__
981+  HWND hwndCancel = GetDlgItem(hwndDlg, IDCANCEL);
982+  INT iDefItem = 0;
983+  HWND hwndFocus;
984+#endif
985+
986   TRACE("%d\n", dwFlags);
987
988   EnableWindow(hwndBack, dwFlags & PSWIZB_BACK);
989   EnableWindow(hwndNext, dwFlags & PSWIZB_NEXT);
990   EnableWindow(hwndFinish, enable_finish);
991
992+#ifndef __REACTOS__
993   /* set the default pushbutton to an enabled button */
994   if (enable_finish)
995     SendMessageW(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0);
996@@ -2455,6 +2467,7 @@ static void PROPSHEET_SetWizButtons(HWND
997     SendMessageW(hwndDlg, DM_SETDEFID, IDC_BACK_BUTTON, 0);
998   else
999     SendMessageW(hwndDlg, DM_SETDEFID, IDCANCEL, 0);
1000+#endif
1001
1002   if (!psInfo->hasFinish)
1003   {
1004@@ -2474,6 +2487,25 @@ static void PROPSHEET_SetWizButtons(HWND
1005       ShowWindow(hwndNext, SW_SHOW);
1006     }
1007   }
1008+
1009+#ifdef __REACTOS__
1010+  /* set the default pushbutton to an enabled button */
1011+  if (((dwFlags & PSWIZB_FINISH) || psInfo->hasFinish) && !(dwFlags & PSWIZB_DISABLEDFINISH))
1012+    iDefItem = IDC_FINISH_BUTTON;
1013+  else if (dwFlags & PSWIZB_NEXT)
1014+    iDefItem = IDC_NEXT_BUTTON;
1015+  else if (dwFlags & PSWIZB_BACK)
1016+    iDefItem = IDC_BACK_BUTTON;
1017+  else
1018+    iDefItem = IDCANCEL;
1019+  SendMessageW(hwndDlg, DM_SETDEFID, iDefItem, 0);
1020+
1021+  /* Set focus if no control has it */
1022+  hwndFocus = GetFocus();
1023+  if (!hwndFocus || hwndFocus == hwndCancel)
1024+    SetFocus(GetDlgItem(hwndDlg, iDefItem));
1025+#endif
1026+
1027 }
1028
1029 /******************************************************************************
1030@@ -3282,7 +3314,11 @@ static LRESULT PROPSHEET_Paint(HWND hwnd
1031
1032         hOldFont = SelectObject(hdc, psInfo->hFontBold);
1033
1034+#ifdef __REACTOS__
1035+        if (psInfo->ppshheader.u5.hbmHeader)
1036+#else
1037         if (psInfo->ppshheader.dwFlags & PSH_USEHBMHEADER)
1038+#endif
1039         {
1040             hbmp = SelectObject(hdcSrc, psInfo->ppshheader.u5.hbmHeader);
1041
1042@@ -3357,7 +3393,11 @@ static LRESULT PROPSHEET_Paint(HWND hwnd
1043 	if (ppshpage->dwFlags & PSP_USEHEADERSUBTITLE) {
1044 	    SelectObject(hdc, psInfo->hFont);
1045 	    SetRect(&r, 40, 25, rzone.right - 69, rzone.bottom);
1046+#ifdef __REACTOS__
1047+            if (!IS_INTRESOURCE(ppshpage->pszHeaderSubTitle))
1048+#else
1049             if (!IS_INTRESOURCE(ppshpage->pszHeaderTitle))
1050+#endif
1051                 DrawTextW(hdc, ppshpage->pszHeaderSubTitle, -1, &r, DT_LEFT | DT_WORDBREAK);
1052 	    else
1053 	    {
1054@@ -3379,7 +3419,12 @@ static LRESULT PROPSHEET_Paint(HWND hwnd
1055
1056     if ( (ppshpage && (ppshpage->dwFlags & PSP_HIDEHEADER)) &&
1057 	 (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW)) &&
1058+#ifdef __REACTOS__
1059+	 (psInfo->ppshheader.dwFlags & PSH_WATERMARK) &&
1060+	 (psInfo->ppshheader.u4.hbmWatermark) )
1061+#else
1062 	 (psInfo->ppshheader.dwFlags & PSH_WATERMARK) )
1063+#endif
1064     {
1065 	HWND hwndLine = GetDlgItem(hwnd, IDC_SUNKEN_LINE);
1066
1067diff -pudN e:\wine\dlls\comctl32/rebar.c e:\reactos\dll\win32\comctl32/rebar.c
1068--- e:\wine\dlls\comctl32/rebar.c	2017-09-07 12:58:14 +0100
1069+++ e:\reactos\dll\win32\comctl32/rebar.c	2017-05-07 14:47:57 +0100
1070@@ -50,7 +50,6 @@
1071  *   - WM_QUERYNEWPALETTE
1072  *   - WM_RBUTTONDOWN
1073  *   - WM_RBUTTONUP
1074- *   - WM_SYSCOLORCHANGE
1075  *   - WM_VKEYTOITEM
1076  *   - WM_WININICHANGE
1077  *   Notifications:
1078@@ -1819,16 +1818,43 @@ static LRESULT REBAR_EraseBkGnd (const R
1079     RECT cr;
1080     COLORREF old = CLR_NONE, new;
1081     HTHEME theme = GetWindowTheme (infoPtr->hwndSelf);
1082+#ifdef __REACTOS__
1083+    HRGN hrgn;
1084+#endif
1085
1086     GetClientRect (infoPtr->hwndSelf, &cr);
1087
1088+#ifdef __REACTOS__
1089+
1090+    if (theme)
1091+    {
1092+        if (IsThemeBackgroundPartiallyTransparent(theme, RP_BACKGROUND, 0))
1093+        {
1094+            DrawThemeParentBackground (infoPtr->hwndSelf, hdc, &cr);
1095+        }
1096+        DrawThemeBackground (theme, hdc, 0, 0, &cr, NULL);
1097+    }
1098+
1099+    hrgn = CreateRectRgn(cr.left, cr.top, cr.right, cr.bottom);
1100+
1101+#endif
1102+
1103     oldrow = -1;
1104     for(i=0; i<infoPtr->uNumBands; i++) {
1105         RECT rcBand;
1106+#ifdef __REACTOS__
1107+        RECT rcBandReal;
1108+        HRGN hrgnBand;
1109+#endif
1110+
1111         lpBand = REBAR_GetBand(infoPtr, i);
1112 	if (HIDDENBAND(lpBand)) continue;
1113         translate_rect(infoPtr, &rcBand, &lpBand->rcBand);
1114
1115+#ifdef __REACTOS__
1116+        rcBandReal = rcBand;
1117+#endif
1118+
1119 	/* draw band separator between rows */
1120 	if (lpBand->iRow != oldrow) {
1121 	    oldrow = lpBand->iRow;
1122@@ -1853,6 +1879,9 @@ static LRESULT REBAR_EraseBkGnd (const R
1123 		}
1124                 TRACE ("drawing band separator bottom (%s)\n",
1125                        wine_dbgstr_rect(&rcRowSep));
1126+#ifdef __REACTOS__
1127+        rcBandReal = rcRowSep;
1128+#endif
1129 	    }
1130 	}
1131
1132@@ -1863,6 +1892,9 @@ static LRESULT REBAR_EraseBkGnd (const R
1133 	    if (infoPtr->dwStyle & CCS_VERT) {
1134                 rcSep.bottom = rcSep.top;
1135 		rcSep.top -= SEP_WIDTH_SIZE;
1136+#ifdef __REACTOS__
1137+        rcBandReal.top -= SEP_WIDTH_SIZE;
1138+#endif
1139                 if (theme)
1140                     DrawThemeEdge (theme, hdc, RP_BAND, 0, &rcSep, EDGE_ETCHED, BF_BOTTOM, NULL);
1141                 else
1142@@ -1871,6 +1903,9 @@ static LRESULT REBAR_EraseBkGnd (const R
1143 	    else {
1144                 rcSep.right = rcSep.left;
1145 		rcSep.left -= SEP_WIDTH_SIZE;
1146+#ifdef __REACTOS__
1147+        rcBandReal.left -= SEP_WIDTH_SIZE;
1148+#endif
1149                 if (theme)
1150                     DrawThemeEdge (theme, hdc, RP_BAND, 0, &rcSep, EDGE_ETCHED, BF_RIGHT, NULL);
1151                 else
1152@@ -1901,6 +1936,9 @@ static LRESULT REBAR_EraseBkGnd (const R
1153 #endif
1154 	}
1155
1156+#ifdef __REACTOS__
1157+        if (!theme)
1158+#else
1159         if (theme)
1160         {
1161             /* When themed, the background color is ignored (but not a
1162@@ -1908,6 +1946,7 @@ static LRESULT REBAR_EraseBkGnd (const R
1163             DrawThemeBackground (theme, hdc, 0, 0, &cr, &rcBand);
1164         }
1165         else
1166+#endif
1167         {
1168             old = SetBkColor (hdc, new);
1169             TRACE("%s background color=0x%06x, band %s\n",
1170@@ -1918,7 +1957,26 @@ static LRESULT REBAR_EraseBkGnd (const R
1171             if (lpBand->clrBack != CLR_NONE)
1172                 SetBkColor (hdc, old);
1173         }
1174+
1175+#ifdef __REACTOS__
1176+        hrgnBand = CreateRectRgn(rcBandReal.left, rcBandReal.top, rcBandReal.right, rcBandReal.bottom);
1177+        CombineRgn(hrgn, hrgn, hrgnBand, RGN_DIFF);
1178+        DeleteObject(hrgnBand);
1179+#endif
1180     }
1181+
1182+#if 1
1183+#ifdef __REACTOS__
1184+    if (!theme)
1185+#endif
1186+    {
1187+        //FIXME: Apparently painting the remaining area is a v6 feature
1188+        HBRUSH hbrush = CreateSolidBrush(new);
1189+        FillRgn(hdc, hrgn, hbrush);
1190+        DeleteObject(hbrush);
1191+    }
1192+    DeleteObject(hrgn);
1193+#endif
1194     return TRUE;
1195 }
1196
1197@@ -2887,12 +2945,26 @@ REBAR_ShowBand (REBAR_INFO *infoPtr, INT
1198
1199
1200 static LRESULT
1201+#ifdef __REACTOS__
1202+REBAR_SizeToRect (REBAR_INFO *infoPtr, WPARAM flags, RECT *lpRect)
1203+#else
1204 REBAR_SizeToRect (REBAR_INFO *infoPtr, const RECT *lpRect)
1205+#endif
1206 {
1207     if (!lpRect) return FALSE;
1208
1209     TRACE("[%s]\n", wine_dbgstr_rect(lpRect));
1210     REBAR_SizeToHeight(infoPtr, get_rect_cy(infoPtr, lpRect));
1211+
1212+#ifdef __REACTOS__
1213+    /* Note that this undocumented flag is available on comctl32 v6 or later */
1214+    if ((flags & RBSTR_CHANGERECT) != 0)
1215+    {
1216+        RECT rcRebar;
1217+        GetClientRect(infoPtr->hwndSelf, &rcRebar);
1218+        lpRect->bottom = lpRect->top + (rcRebar.bottom - rcRebar.top);
1219+    }
1220+#endif
1221     return TRUE;
1222 }
1223
1224@@ -3199,7 +3271,11 @@ REBAR_NCCalcSize (const REBAR_INFO *info
1225     else if ((theme = GetWindowTheme (infoPtr->hwndSelf)))
1226     {
1227         /* FIXME: should use GetThemeInt */
1228+#ifdef __REACTOS__
1229+        rect->top = (rect->top + 1 < rect->bottom) ? rect->top : rect->bottom;
1230+#else
1231         rect->top = min(rect->top + 1, rect->bottom);
1232+#endif
1233     }
1234     TRACE("new client=(%s)\n", wine_dbgstr_rect(rect));
1235     return 0;
1236@@ -3300,7 +3376,11 @@ REBAR_NCHitTest (const REBAR_INFO *infoP
1237 			   (INT *)&nmmouse.dwItemSpec);
1238     nmmouse.dwItemData = 0;
1239     nmmouse.pt = clpt;
1240+#ifdef __REACTOS__
1241+    nmmouse.dwHitInfo = scrap;
1242+#else
1243     nmmouse.dwHitInfo = 0;
1244+#endif
1245     if ((i = REBAR_Notify((NMHDR *) &nmmouse, infoPtr, NM_NCHITTEST))) {
1246 	TRACE("notify changed return value from %ld to %d\n",
1247 	      ret, i);
1248@@ -3372,6 +3452,9 @@ REBAR_Paint (const REBAR_INFO *infoPtr,
1249 {
1250     if (hdc) {
1251         TRACE("painting\n");
1252+#ifdef __REACTOS__
1253+        REBAR_EraseBkGnd (infoPtr, hdc);
1254+#endif
1255         REBAR_Refresh (infoPtr, hdc);
1256     } else {
1257         PAINTSTRUCT ps;
1258@@ -3650,7 +3733,11 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg,
1259 	    return REBAR_ShowBand (infoPtr, wParam, lParam);
1260
1261 	case RB_SIZETORECT:
1262+#ifdef __REACTOS__
1263+	    return REBAR_SizeToRect (infoPtr, wParam, (LPRECT)lParam);
1264+#else
1265 	    return REBAR_SizeToRect (infoPtr, (LPCRECT)lParam);
1266+#endif
1267
1268
1269 /*    Messages passed to parent */
1270@@ -3733,6 +3820,11 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg,
1271
1272         case WM_SYSCOLORCHANGE:
1273             COMCTL32_RefreshSysColors();
1274+#ifdef __REACTOS__
1275+            /* r51522 - Properly support WM_SYSCOLORCHANGE */
1276+            infoPtr->clrBtnText = comctl32_color.clrBtnText;
1277+            infoPtr->clrBtnFace = comctl32_color.clrBtnFace;
1278+#endif
1279             return 0;
1280
1281 /*      case WM_VKEYTOITEM:     supported according to ControlSpy */
1282diff -pudN e:\wine\dlls\comctl32/syslink.c e:\reactos\dll\win32\comctl32/syslink.c
1283--- e:\wine\dlls\comctl32/syslink.c	2017-09-07 12:58:14 +0100
1284+++ e:\reactos\dll\win32\comctl32/syslink.c	2017-05-27 17:00:22 +0100
1285@@ -29,8 +29,6 @@
1286
1287 #include "comctl32.h"
1288
1289-#include <wine/list.h>
1290-
1291 WINE_DEFAULT_DEBUG_CHANNEL(syslink);
1292
1293 typedef struct
1294diff -pudN e:\wine\dlls\comctl32/theme_button.c e:\reactos\dll\win32\comctl32/theme_button.c
1295--- e:\wine\dlls\comctl32/theme_button.c	2017-09-07 12:58:14 +0100
1296+++ e:\reactos\dll\win32\comctl32/theme_button.c	2017-08-11 22:11:08 +0100
1297@@ -34,7 +34,30 @@ typedef enum
1298 	STATE_DEFAULTED
1299 } ButtonState;
1300
1301+#ifdef __REACTOS__ /* r73885 */
1302+typedef void (*pfThemedPaint)(HTHEME theme, HWND hwnd, HDC hdc, ButtonState drawState, UINT dtFlags, BOOL focused, LPARAM prfFlag);
1303+#else
1304 typedef void (*pfThemedPaint)(HTHEME theme, HWND hwnd, HDC hdc, ButtonState drawState, UINT dtFlags, BOOL focused);
1305+#endif
1306+
1307+#ifdef __REACTOS__ /* r73885 & r73907 */
1308+static inline LONG get_button_state( HWND hwnd )
1309+{
1310+    return _GetButtonData(hwnd)->state;
1311+}
1312+
1313+static inline HFONT get_button_font( HWND hwnd )
1314+{
1315+    return (HFONT)_GetButtonData(hwnd)->font;
1316+}
1317+
1318+static inline LONG_PTR get_button_image(HWND hwnd)
1319+{
1320+    return _GetButtonData(hwnd)->image;
1321+}
1322+
1323+BOOL BUTTON_DrawIml(HDC hdc, BUTTON_IMAGELIST *pimlData, RECT *prc, BOOL bOnlyCalc);
1324+#endif
1325
1326 static UINT get_drawtext_flags(DWORD style, DWORD ex_style)
1327 {
1328@@ -87,22 +110,56 @@ static inline WCHAR *get_button_text(HWN
1329     return text;
1330 }
1331
1332+#ifdef __REACTOS__ /* r73885 */
1333+static void PB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused, LPARAM prfFlag)
1334+#else
1335 static void PB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused)
1336+#endif
1337 {
1338     static const int states[] = { PBS_NORMAL, PBS_DISABLED, PBS_HOT, PBS_PRESSED, PBS_DEFAULTED };
1339
1340     RECT bgRect, textRect;
1341+#ifdef __REACTOS__ /* r73885 */
1342+    HFONT font = get_button_font(hwnd);
1343+#else
1344     HFONT font = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0);
1345+#endif
1346     HFONT hPrevFont = font ? SelectObject(hDC, font) : NULL;
1347     int state = states[ drawState ];
1348     WCHAR *text = get_button_text(hwnd);
1349+#ifdef __REACTOS__ /* r74012 & r74406 */
1350+    PBUTTON_DATA pdata = _GetButtonData(hwnd);
1351+    HWND parent;
1352+    HBRUSH hBrush;
1353+#endif
1354
1355     GetClientRect(hwnd, &bgRect);
1356     GetThemeBackgroundContentRect(theme, hDC, BP_PUSHBUTTON, state, &bgRect, &textRect);
1357
1358+#ifdef __REACTOS__ /* r73885 & r74149 */
1359+    if (prfFlag == 0)
1360+    {
1361+        if (IsThemeBackgroundPartiallyTransparent(theme, BP_PUSHBUTTON, state))
1362+            DrawThemeParentBackground(hwnd, hDC, NULL);
1363+    }
1364+#else
1365     if (IsThemeBackgroundPartiallyTransparent(theme, BP_PUSHBUTTON, state))
1366         DrawThemeParentBackground(hwnd, hDC, NULL);
1367+#endif
1368+
1369+#ifdef __REACTOS__ /* r74406 */
1370+    parent = GetParent(hwnd);
1371+    if (!parent) parent = hwnd;
1372+    hBrush = (HBRUSH)SendMessageW( parent, WM_CTLCOLORBTN, (WPARAM)hDC, (LPARAM)hwnd );
1373+    FillRect( hDC, &bgRect, hBrush );
1374+#endif
1375+
1376     DrawThemeBackground(theme, hDC, BP_PUSHBUTTON, state, &bgRect, NULL);
1377+
1378+#ifdef __REACTOS__ /* r74012 */
1379+    BUTTON_DrawIml(hDC, &pdata->imlData, &textRect, FALSE);
1380+#endif
1381+
1382     if (text)
1383     {
1384         DrawThemeText(theme, hDC, BP_PUSHBUTTON, state, text, lstrlenW(text), dtFlags, 0, &textRect);
1385@@ -127,7 +184,11 @@ static void PB_draw(HTHEME theme, HWND h
1386     if (hPrevFont) SelectObject(hDC, hPrevFont);
1387 }
1388
1389+#ifdef __REACTOS__ /* r73885 */
1390+static void CB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused, LPARAM prfFlag)
1391+#else
1392 static void CB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused)
1393+#endif
1394 {
1395     static const int cb_states[3][5] =
1396     {
1397@@ -145,7 +206,11 @@ static void CB_draw(HTHEME theme, HWND h
1398     SIZE sz;
1399     RECT bgRect, textRect;
1400     HFONT font, hPrevFont = NULL;
1401+#ifdef __REACTOS__ /* r73885 */
1402+    LRESULT checkState = get_button_state(hwnd) & 3;
1403+#else
1404     LRESULT checkState = SendMessageW(hwnd, BM_GETCHECK, 0, 0);
1405+#endif
1406     DWORD dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
1407     int part = ((dwStyle & BUTTON_TYPE) == BS_RADIOBUTTON) || ((dwStyle & BUTTON_TYPE) == BS_AUTORADIOBUTTON)
1408              ? BP_RADIOBUTTON
1409@@ -156,6 +221,10 @@ static void CB_draw(HTHEME theme, HWND h
1410     WCHAR *text = get_button_text(hwnd);
1411     LOGFONTW lf;
1412     BOOL created_font = FALSE;
1413+#ifdef __REACTOS__ /* r74406 */
1414+    HWND parent;
1415+    HBRUSH hBrush;
1416+#endif
1417
1418     HRESULT hr = GetThemeFont(theme, hDC, part, state, TMT_FONT, &lf);
1419     if (SUCCEEDED(hr)) {
1420@@ -168,7 +237,11 @@ static void CB_draw(HTHEME theme, HWND h
1421             created_font = TRUE;
1422         }
1423     } else {
1424+#ifdef __REACTOS__ /* r73885 */
1425+        font = get_button_font(hwnd);
1426+#else
1427         font = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0);
1428+#endif
1429         hPrevFont = SelectObject(hDC, font);
1430     }
1431
1432@@ -176,6 +249,23 @@ static void CB_draw(HTHEME theme, HWND h
1433         sz.cx = sz.cy = 13;
1434
1435     GetClientRect(hwnd, &bgRect);
1436+
1437+#ifdef __REACTOS__ /* r73885, r74149 and r74406 */
1438+    if (prfFlag == 0)
1439+    {
1440+        DrawThemeParentBackground(hwnd, hDC, NULL);
1441+    }
1442+
1443+    parent = GetParent(hwnd);
1444+    if (!parent) parent = hwnd;
1445+    hBrush = (HBRUSH)SendMessageW(parent, WM_CTLCOLORSTATIC,
1446+                                 (WPARAM)hDC, (LPARAM)hwnd);
1447+    if (!hBrush) /* did the app forget to call defwindowproc ? */
1448+        hBrush = (HBRUSH)DefWindowProcW(parent, WM_CTLCOLORSTATIC,
1449+                                        (WPARAM)hDC, (LPARAM)hwnd );
1450+    FillRect( hDC, &bgRect, hBrush );
1451+#endif
1452+
1453     GetThemeBackgroundContentRect(theme, hDC, part, state, &bgRect, &textRect);
1454
1455     if (dtFlags & DT_SINGLELINE) /* Center the checkbox / radio button to the text. */
1456@@ -186,7 +276,9 @@ static void CB_draw(HTHEME theme, HWND h
1457     bgRect.right = bgRect.left + sz.cx;
1458     textRect.left = bgRect.right + 6;
1459
1460+#ifndef __REACTOS__ /* r74406 */
1461     DrawThemeParentBackground(hwnd, hDC, NULL);
1462+#endif
1463
1464     DrawThemeBackground(theme, hDC, part, state, &bgRect, NULL);
1465     if (text)
1466@@ -214,7 +306,11 @@ static void CB_draw(HTHEME theme, HWND h
1467     if (hPrevFont) SelectObject(hDC, hPrevFont);
1468 }
1469
1470+#ifdef __REACTOS__ /* r73885 */
1471+static void GB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused, LPARAM prfFlag)
1472+#else
1473 static void GB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused)
1474+#endif
1475 {
1476     static const int states[] = { GBS_NORMAL, GBS_DISABLED, GBS_NORMAL, GBS_NORMAL, GBS_NORMAL };
1477
1478@@ -224,6 +320,11 @@ static void GB_draw(HTHEME theme, HWND h
1479     LOGFONTW lf;
1480     HFONT font, hPrevFont = NULL;
1481     BOOL created_font = FALSE;
1482+#ifdef __REACTOS__ /* r74406 */
1483+    HWND parent;
1484+    HBRUSH hBrush;
1485+    RECT clientRect;
1486+#endif
1487
1488     HRESULT hr = GetThemeFont(theme, hDC, BP_GROUPBOX, state, TMT_FONT, &lf);
1489     if (SUCCEEDED(hr)) {
1490@@ -235,7 +336,11 @@ static void GB_draw(HTHEME theme, HWND h
1491             created_font = TRUE;
1492         }
1493     } else {
1494+#ifdef __REACTOS__ /* r73885 */
1495+        font = get_button_font(hwnd);
1496+#else
1497         font = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0);
1498+#endif
1499         hPrevFont = SelectObject(hDC, font);
1500     }
1501
1502@@ -257,8 +362,29 @@ static void GB_draw(HTHEME theme, HWND h
1503     GetThemeBackgroundContentRect(theme, hDC, BP_GROUPBOX, state, &bgRect, &contentRect);
1504     ExcludeClipRect(hDC, contentRect.left, contentRect.top, contentRect.right, contentRect.bottom);
1505
1506+#ifdef __REACTOS__ /* r73885 & r74149 */
1507+    if (prfFlag == 0)
1508+    {
1509+        if (IsThemeBackgroundPartiallyTransparent(theme, BP_GROUPBOX, state))
1510+            DrawThemeParentBackground(hwnd, hDC, NULL);
1511+    }
1512+#else
1513     if (IsThemeBackgroundPartiallyTransparent(theme, BP_GROUPBOX, state))
1514         DrawThemeParentBackground(hwnd, hDC, NULL);
1515+#endif
1516+
1517+#ifdef __REACTOS__ /* r74406 */
1518+    parent = GetParent(hwnd);
1519+    if (!parent) parent = hwnd;
1520+    hBrush = (HBRUSH)SendMessageW(parent, WM_CTLCOLORSTATIC,
1521+                                  (WPARAM)hDC, (LPARAM)hwnd);
1522+    if (!hBrush) /* did the app forget to call defwindowproc ? */
1523+        hBrush = (HBRUSH)DefWindowProcW(parent, WM_CTLCOLORSTATIC,
1524+                                       (WPARAM)hDC, (LPARAM)hwnd );
1525+    GetClientRect(hwnd, &clientRect);
1526+    FillRect( hDC, &clientRect, hBrush );
1527+#endif
1528+
1529     DrawThemeBackground(theme, hDC, BP_GROUPBOX, state, &bgRect, NULL);
1530
1531     SelectClipRgn(hDC, NULL);
1532@@ -294,32 +420,84 @@ static const pfThemedPaint btnThemedPain
1533     NULL, /* Not defined */
1534 };
1535
1536+#ifdef __REACTOS__ /* r73873 */
1537+BOOL BUTTON_PaintWithTheme(HTHEME theme, HWND hwnd, HDC hParamDC, LPARAM prfFlag)
1538+#else
1539 static BOOL BUTTON_Paint(HTHEME theme, HWND hwnd, HDC hParamDC)
1540+#endif
1541 {
1542+#ifdef __REACTOS__ /* r73873, r73897 and r74120 */
1543+    DWORD dwStyle;
1544+    DWORD dwStyleEx;
1545+    DWORD type;
1546+    UINT dtFlags;
1547+    int state;
1548+#else
1549     PAINTSTRUCT ps;
1550     HDC hDC;
1551     DWORD dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
1552     DWORD dwStyleEx = GetWindowLongW(hwnd, GWL_EXSTYLE);
1553     UINT dtFlags = get_drawtext_flags(dwStyle, dwStyleEx);
1554     int state = (int)SendMessageW(hwnd, BM_GETSTATE, 0, 0);
1555+#endif
1556     ButtonState drawState;
1557+#ifdef __REACTOS__ /* r73873, r73897, r73907 and r74120 */
1558+    pfThemedPaint paint;
1559+
1560+    dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
1561+    type = dwStyle & BUTTON_TYPE;
1562+
1563+    if (type != BS_PUSHBUTTON && type != BS_DEFPUSHBUTTON && (dwStyle & BS_PUSHLIKE))
1564+        type = BS_PUSHBUTTON;
1565+
1566+    paint = btnThemedPaintFunc[type];
1567+    if (!paint)
1568+        return FALSE;
1569+
1570+    if (get_button_image(hwnd) != 0)
1571+        return FALSE;
1572+
1573+    dwStyleEx = GetWindowLongW(hwnd, GWL_EXSTYLE);
1574+    dtFlags = get_drawtext_flags(dwStyle, dwStyleEx);
1575+    state = get_button_state(hwnd);
1576+#else
1577     pfThemedPaint paint = btnThemedPaintFunc[ dwStyle & BUTTON_TYPE ];
1578+#endif
1579
1580     if(IsWindowEnabled(hwnd))
1581     {
1582-        if(state & BST_PUSHED) drawState = STATE_PRESSED;
1583-        else if(state & BST_HOT) drawState = STATE_HOT;
1584-        else if(state & BST_FOCUS) drawState = STATE_DEFAULTED;
1585-        else drawState = STATE_NORMAL;
1586+        if(state & BST_PUSHED)
1587+            drawState = STATE_PRESSED;
1588+        else if ((dwStyle & BS_PUSHLIKE) && (state & (BST_CHECKED|BST_INDETERMINATE)))
1589+            drawState = STATE_PRESSED;
1590+        else if(state & BST_HOT)
1591+            drawState = STATE_HOT;
1592+        else if(state & BST_FOCUS)
1593+            drawState = STATE_DEFAULTED;
1594+        else
1595+            drawState = STATE_NORMAL;
1596     }
1597-    else drawState = STATE_DISABLED;
1598+    else
1599+        drawState = STATE_DISABLED;
1600
1601+#ifndef __REACTOS__ /* r73873 */
1602     hDC = hParamDC ? hParamDC : BeginPaint(hwnd, &ps);
1603     if (paint) paint(theme, hwnd, hDC, drawState, dtFlags, state & BST_FOCUS);
1604     if (!hParamDC) EndPaint(hwnd, &ps);
1605+#endif
1606+
1607+#ifdef __REACTOS__ /* r74074 & r74120 */
1608+    if (drawState == STATE_NORMAL && type == BS_DEFPUSHBUTTON)
1609+    {
1610+        drawState = STATE_DEFAULTED;
1611+    }
1612+#endif
1613+
1614+    paint(theme, hwnd, hParamDC, drawState, dtFlags, state & BST_FOCUS, prfFlag);
1615     return TRUE;
1616 }
1617
1618+#ifndef __REACTOS__ /* r73873 */
1619 /**********************************************************************
1620  * The button control subclass window proc.
1621  */
1622@@ -416,3 +594,4 @@ LRESULT CALLBACK THEMING_ButtonSubclassP
1623     }
1624     return 0;
1625 }
1626+#endif /* !__REACTOS__ */
1627diff -pudN e:\wine\dlls\comctl32/theme_edit.c e:\reactos\dll\win32\comctl32/theme_edit.c
1628--- e:\wine\dlls\comctl32/theme_edit.c	2017-09-07 12:58:14 +0100
1629+++ e:\reactos\dll\win32\comctl32/theme_edit.c	2017-05-21 20:36:43 +0100
1630@@ -52,8 +52,15 @@ static void nc_paint (HTHEME theme, HWND
1631             CombineRgn (cliprgn, cliprgn, region, RGN_AND);
1632         OffsetRect(&r, -r.left, -r.top);
1633
1634+#ifdef __REACTOS__ /* r73789 */
1635+        dc = GetWindowDC(hwnd);
1636+        /* Exclude client part */
1637+        ExcludeClipRect(dc, r.left + cxEdge, r.top + cyEdge,
1638+            r.right - cxEdge, r.bottom -cyEdge);
1639+#else
1640         dc = GetDCEx(hwnd, region, DCX_WINDOW|DCX_INTERSECTRGN);
1641         OffsetRect(&r, -r.left, -r.top);
1642+#endif
1643
1644         if (IsThemeBackgroundPartiallyTransparent (theme, part, state))
1645             DrawThemeParentBackground(hwnd, dc, &r);
1646diff -pudN e:\wine\dlls\comctl32/theme_listbox.c e:\reactos\dll\win32\comctl32/theme_listbox.c
1647--- e:\wine\dlls\comctl32/theme_listbox.c	2017-09-07 12:58:14 +0100
1648+++ e:\reactos\dll\win32\comctl32/theme_listbox.c	2017-05-21 20:37:26 +0100
1649@@ -42,8 +42,15 @@ static void nc_paint (HTHEME theme, HWND
1650             CombineRgn (cliprgn, cliprgn, region, RGN_AND);
1651         OffsetRect(&r, -r.left, -r.top);
1652
1653+#ifdef __REACTOS__ /* r73789 */
1654+        dc = GetWindowDC(hwnd);
1655+        /* Exclude client part */
1656+        ExcludeClipRect(dc, r.left + cxEdge, r.top + cyEdge,
1657+            r.right - cxEdge, r.bottom -cyEdge);
1658+#else
1659         dc = GetDCEx(hwnd, region, DCX_WINDOW|DCX_INTERSECTRGN);
1660         OffsetRect(&r, -r.left, -r.top);
1661+#endif
1662
1663         if (IsThemeBackgroundPartiallyTransparent (theme, 0, 0))
1664             DrawThemeParentBackground(hwnd, dc, &r);
1665diff -pudN e:\wine\dlls\comctl32/theming.c e:\reactos\dll\win32\comctl32/theming.c
1666--- e:\wine\dlls\comctl32/theming.c	2017-09-07 12:58:14 +0100
1667+++ e:\reactos\dll\win32\comctl32/theming.c	2017-05-21 20:45:56 +0100
1668@@ -26,12 +26,16 @@ WINE_DEFAULT_DEBUG_CHANNEL(theming);
1669 typedef LRESULT (CALLBACK* THEMING_SUBCLASSPROC)(HWND, UINT, WPARAM, LPARAM,
1670     ULONG_PTR);
1671
1672+#ifndef __REACTOS__ /* r73871 */
1673 extern LRESULT CALLBACK THEMING_ButtonSubclassProc (HWND, UINT, WPARAM, LPARAM,
1674                                                     ULONG_PTR) DECLSPEC_HIDDEN;
1675+#endif
1676 extern LRESULT CALLBACK THEMING_ComboSubclassProc (HWND, UINT, WPARAM, LPARAM,
1677                                                    ULONG_PTR) DECLSPEC_HIDDEN;
1678+#ifndef __REACTOS__ /* r73803 */
1679 extern LRESULT CALLBACK THEMING_DialogSubclassProc (HWND, UINT, WPARAM, LPARAM,
1680                                                     ULONG_PTR) DECLSPEC_HIDDEN;
1681+#endif
1682 extern LRESULT CALLBACK THEMING_EditSubclassProc (HWND, UINT, WPARAM, LPARAM,
1683                                                   ULONG_PTR) DECLSPEC_HIDDEN;
1684 extern LRESULT CALLBACK THEMING_ListBoxSubclassProc (HWND, UINT, WPARAM, LPARAM,
1685@@ -48,8 +52,10 @@ static const struct ThemingSubclass
1686     THEMING_SUBCLASSPROC subclassProc;
1687 } subclasses[] = {
1688     /* Note: list must be sorted by class name */
1689+#ifndef __REACTOS__ /* r73803 & r73871 */
1690     {dialogClass,          THEMING_DialogSubclassProc},
1691     {WC_BUTTONW,           THEMING_ButtonSubclassProc},
1692+#endif
1693     {WC_COMBOBOXW,         THEMING_ComboSubclassProc},
1694     {comboLboxClass,       THEMING_ListBoxSubclassProc},
1695     {WC_EDITW,             THEMING_EditSubclassProc},
1696@@ -89,17 +95,23 @@ MAKE_SUBCLASS_PROC(1)
1697 MAKE_SUBCLASS_PROC(2)
1698 MAKE_SUBCLASS_PROC(3)
1699 MAKE_SUBCLASS_PROC(4)
1700+#ifndef __REACTOS__ /* r73803 & r73871 */
1701 MAKE_SUBCLASS_PROC(5)
1702 MAKE_SUBCLASS_PROC(6)
1703+#endif
1704
1705 static const WNDPROC subclassProcs[NUM_SUBCLASSES] = {
1706     subclass_proc0,
1707     subclass_proc1,
1708     subclass_proc2,
1709     subclass_proc3,
1710+#ifdef __REACTOS__ /* r73871 */
1711+    subclass_proc4
1712+#else
1713     subclass_proc4,
1714     subclass_proc5,
1715     subclass_proc6
1716+#endif
1717 };
1718
1719 /***********************************************************************
1720@@ -108,15 +120,23 @@ static const WNDPROC subclassProcs[NUM_S
1721  * Register classes for standard controls that will shadow the system
1722  * classes.
1723  */
1724+#ifdef __REACTOS__ /* r73803 */
1725+void THEMING_Initialize(HANDLE hActCtx5, HANDLE hActCtx6)
1726+#else
1727 void THEMING_Initialize (void)
1728+#endif
1729 {
1730     unsigned int i;
1731     static const WCHAR subclassPropName[] =
1732         { 'C','C','3','2','T','h','e','m','i','n','g','S','u','b','C','l',0 };
1733     static const WCHAR refDataPropName[] =
1734         { 'C','C','3','2','T','h','e','m','i','n','g','D','a','t','a',0 };
1735-
1736+#ifdef __REACTOS__ /* r73803 */
1737+    ULONG_PTR ulCookie;
1738+    BOOL ret, bActivated;
1739+#else
1740     if (!IsThemeActive()) return;
1741+#endif
1742
1743     atSubclassProp = GlobalAddAtomW (subclassPropName);
1744     atRefDataProp = GlobalAddAtomW (refDataPropName);
1745@@ -126,7 +146,17 @@ void THEMING_Initialize (void)
1746         WNDCLASSEXW class;
1747
1748         class.cbSize = sizeof(class);
1749+
1750+#ifdef __REACTOS__ /* r73803 */
1751+        bActivated = ActivateActCtx(hActCtx5, &ulCookie);
1752+        ret = GetClassInfoExW (NULL, subclasses[i].className, &class);
1753+        if (bActivated)
1754+            DeactivateActCtx(0, ulCookie);
1755+
1756+        if (!ret)
1757+#else
1758         if (!GetClassInfoExW (NULL, subclasses[i].className, &class))
1759+#endif
1760         {
1761             ERR("Could not retrieve information for class %s\n",
1762                 debugstr_w (subclasses[i].className));
1763@@ -134,6 +164,10 @@ void THEMING_Initialize (void)
1764         }
1765         originalProcs[i] = class.lpfnWndProc;
1766         class.lpfnWndProc = subclassProcs[i];
1767+#ifdef __REACTOS__ /* r73803 */
1768+        class.style |= CS_GLOBALCLASS;
1769+        class.hInstance = COMCTL32_hModule;
1770+#endif
1771
1772         if (!class.lpfnWndProc)
1773         {
1774@@ -142,9 +176,16 @@ void THEMING_Initialize (void)
1775             continue;
1776         }
1777
1778+#ifdef __REACTOS__ /* r73803 */
1779+        bActivated = ActivateActCtx(hActCtx6, &ulCookie);
1780+#endif
1781         if (!RegisterClassExW (&class))
1782         {
1783+#ifdef __REACTOS__ /* r73803 */
1784+            WARN("Could not re-register class %s: %x\n",
1785+#else
1786             ERR("Could not re-register class %s: %x\n",
1787+#endif
1788                 debugstr_w (subclasses[i].className), GetLastError ());
1789         }
1790         else
1791@@ -152,6 +193,11 @@ void THEMING_Initialize (void)
1792             TRACE("Re-registered class %s\n",
1793                 debugstr_w (subclasses[i].className));
1794         }
1795+
1796+#ifdef __REACTOS__ /* r73803 */
1797+        if (bActivated)
1798+            DeactivateActCtx(0, ulCookie);
1799+#endif
1800     }
1801 }
1802
1803diff -pudN e:\wine\dlls\comctl32/toolbar.c e:\reactos\dll\win32\comctl32/toolbar.c
1804--- e:\wine\dlls\comctl32/toolbar.c	2017-09-07 12:58:14 +0100
1805+++ e:\reactos\dll\win32\comctl32/toolbar.c	2017-08-04 10:44:05 +0100
1806@@ -33,11 +33,9 @@
1807  *     - TBSTYLE_REGISTERDROP
1808  *     - TBSTYLE_EX_DOUBLEBUFFER
1809  *   - Messages:
1810- *     - TB_GETMETRICS
1811  *     - TB_GETOBJECT
1812  *     - TB_INSERTMARKHITTEST
1813  *     - TB_SAVERESTORE
1814- *     - TB_SETMETRICS
1815  *     - WM_WININICHANGE
1816  *   - Notifications:
1817  *     - NM_CHAR
1818@@ -125,6 +123,11 @@ typedef struct
1819     INT      nOldHit;
1820     INT      nHotItem;        /* index of the "hot" item */
1821     SIZE     szPadding;       /* padding values around button */
1822+#ifdef __REACTOS__
1823+    SIZE     szBarPadding;       /* padding values around the toolbar (NOT USED BUT STORED) */
1824+    SIZE     szSpacing;       /* spacing values between buttons */
1825+    MARGINS  themeMargins;
1826+#endif
1827     INT      iTopMargin;      /* the top margin */
1828     INT      iListGap;        /* default gap between text and image for toolbar with list style */
1829     HFONT    hDefaultFont;
1830@@ -190,12 +193,24 @@ typedef enum
1831 #define ARROW_HEIGHT       3
1832 #define INSERTMARK_WIDTH   2
1833
1834+/* default padding inside a button */
1835 #define DEFPAD_CX 7
1836 #define DEFPAD_CY 6
1837+
1838+#ifdef __REACTOS__
1839+/* default space between buttons and between rows */
1840+#define DEFSPACE_CX 7
1841+#define DEFSPACE_CY 6
1842+#endif
1843+
1844 #define DEFLISTGAP 4
1845
1846 /* vertical padding used in list mode when image is present */
1847+#ifdef __REACTOS__
1848+#define LISTPAD_CY 2
1849+#else
1850 #define LISTPAD_CY 9
1851+#endif
1852
1853 /* how wide to treat the bitmap if it isn't present */
1854 #define NONLIST_NOTEXT_OFFSET 2
1855@@ -239,6 +254,10 @@ static LRESULT TOOLBAR_SetButtonInfo(TOO
1856
1857 static inline int default_top_margin(const TOOLBAR_INFO *infoPtr)
1858 {
1859+#ifdef __REACTOS__
1860+    if (infoPtr->iVersion == 6)
1861+        return 0;
1862+#endif
1863     return (infoPtr->dwStyle & TBSTYLE_FLAT ? 0 : TOP_BORDER);
1864 }
1865
1866@@ -598,6 +617,9 @@ TOOLBAR_DrawString (const TOOLBAR_INFO *
1867     COLORREF clrOldBk = 0;
1868     int oldBkMode = 0;
1869     UINT state = tbcd->nmcd.uItemState;
1870+#ifdef __REACTOS__
1871+    HTHEME theme = GetWindowTheme (infoPtr->hwndSelf);
1872+#endif
1873
1874     /* draw text */
1875     if (lpText && infoPtr->nMaxTextRows > 0) {
1876@@ -627,6 +649,25 @@ TOOLBAR_DrawString (const TOOLBAR_INFO *
1877 	    clrOld = SetTextColor (hdc, tbcd->clrText);
1878 	}
1879
1880+#ifdef __REACTOS__
1881+    if (theme)
1882+    {
1883+        int partId = TP_BUTTON;
1884+        int stateId = TS_NORMAL;
1885+
1886+        if (state & CDIS_DISABLED)
1887+            stateId = TS_DISABLED;
1888+        else if (state & CDIS_SELECTED)
1889+            stateId = TS_PRESSED;
1890+        else if (state & CDIS_CHECKED)
1891+            stateId = (state & CDIS_HOT) ? TS_HOTCHECKED : TS_HOT;
1892+        else if (state & CDIS_HOT)
1893+            stateId = TS_HOT;
1894+
1895+        DrawThemeText(theme, hdc, partId, stateId, lpText, -1, infoPtr->dwDTFlags, 0, rcText);
1896+    }
1897+    else
1898+#endif
1899 	DrawTextW (hdc, lpText, -1, rcText, infoPtr->dwDTFlags);
1900 	SetTextColor (hdc, clrOld);
1901 	if ((state & CDIS_MARKED) && !(dwItemCDFlag & TBCDRF_NOMARK))
1902@@ -723,10 +764,14 @@ TOOLBAR_DrawImage(const TOOLBAR_INFO *in
1903                   const NMTBCUSTOMDRAW *tbcd, DWORD dwItemCDFlag)
1904 {
1905     HIMAGELIST himl = NULL;
1906-    BOOL draw_masked = FALSE;
1907+    BOOL draw_masked = FALSE, draw_desaturated = FALSE;
1908     INT index;
1909     INT offset = 0;
1910     UINT draw_flags = ILD_TRANSPARENT;
1911+#ifdef __REACTOS__
1912+    IMAGEINFO info = {0};
1913+    BITMAP bm = {0};
1914+#endif
1915
1916     if (tbcd->nmcd.uItemState & (CDIS_DISABLED | CDIS_INDETERMINATE))
1917     {
1918@@ -734,7 +779,22 @@ TOOLBAR_DrawImage(const TOOLBAR_INFO *in
1919         if (!himl)
1920         {
1921             himl = TOOLBAR_GetImageListForDrawing(infoPtr, btnPtr, IMAGE_LIST_DEFAULT, &index);
1922+
1923+#ifdef __REACTOS__
1924+            ImageList_GetImageInfo(himl, index, &info);
1925+            GetObjectW(info.hbmImage, sizeof(bm), &bm);
1926+
1927+            if (bm.bmBitsPixel == 32)
1928+            {
1929+                draw_desaturated = TRUE;
1930+            }
1931+            else
1932+            {
1933+                draw_masked = TRUE;
1934+            }
1935+#else
1936             draw_masked = TRUE;
1937+#endif
1938         }
1939     }
1940     else if (tbcd->nmcd.uItemState & CDIS_CHECKED ||
1941@@ -765,9 +825,34 @@ TOOLBAR_DrawImage(const TOOLBAR_INFO *in
1942       index, himl, left, top, offset);
1943
1944     if (draw_masked)
1945+    {
1946+        /* code path for drawing flat disabled icons without alpha channel */
1947         TOOLBAR_DrawMasked (himl, index, tbcd->nmcd.hdc, left + offset, top + offset, draw_flags);
1948+    }
1949+    else if (draw_desaturated)
1950+    {
1951+        /* code path for drawing disabled, alpha-blended (32bpp) icons */
1952+        IMAGELISTDRAWPARAMS imldp = {0};
1953+
1954+        imldp.cbSize = sizeof(imldp);
1955+        imldp.himl   = himl;
1956+        imldp.i      = index;
1957+        imldp.hdcDst = tbcd->nmcd.hdc,
1958+        imldp.x      = offset + left;
1959+        imldp.y      = offset + top;
1960+        imldp.rgbBk  = CLR_NONE;
1961+        imldp.rgbFg  = CLR_DEFAULT;
1962+        imldp.fStyle = ILD_TRANSPARENT;
1963+        imldp.fState = ILS_ALPHA | ILS_SATURATE;
1964+        imldp.Frame  = 192;
1965+
1966+        ImageList_DrawIndirect (&imldp);
1967+    }
1968     else
1969+    {
1970+        /* code path for drawing standard icons as-is */
1971         ImageList_Draw (himl, index, tbcd->nmcd.hdc, left + offset, top + offset, draw_flags);
1972+    }
1973 }
1974
1975 /* draws a blank frame for a toolbar button */
1976@@ -884,14 +969,15 @@ TOOLBAR_DrawButton (const TOOLBAR_INFO *
1977                 InflateRect(&rcsep, -infoPtr->szPadding.cx, -infoPtr->szPadding.cy);
1978                 TOOLBAR_DrawFlatHorizontalSeparator (&rcsep, hdc, infoPtr);
1979             }
1980-	    else
1981-		TOOLBAR_DrawFlatSeparator (&rc, hdc, infoPtr);
1982-	}
1983-	else if (btnPtr->fsStyle != BTNS_SEP) {
1984-	    FIXME("Draw some kind of separator: fsStyle=%x\n",
1985-		  btnPtr->fsStyle);
1986-	}
1987-	return;
1988+            else {
1989+                TOOLBAR_DrawFlatSeparator (&rc, hdc, infoPtr);
1990+            }
1991+        }
1992
1993+        else if (btnPtr->fsStyle != BTNS_SEP) {
1994+            FIXME("Draw some kind of separator: fsStyle=%x\n",
1995+              btnPtr->fsStyle);
1996+        }
1997+        return;
1998     }
1999
2000     /* get a pointer to the text */
2001@@ -933,6 +1019,9 @@ TOOLBAR_DrawButton (const TOOLBAR_INFO *
2002         rcBitmap.left += ((rc.right - rc.left) - infoPtr->nBitmapWidth) / 2;
2003
2004     rcBitmap.top += infoPtr->szPadding.cy / 2;
2005+#ifdef __REACTOS__
2006+    rcBitmap.top += infoPtr->themeMargins.cyTopHeight;
2007+#endif
2008
2009     TRACE("iBitmap=%d, start=(%d,%d) w=%d, h=%d\n",
2010       btnPtr->iBitmap, rcBitmap.left, rcBitmap.top,
2011@@ -1027,7 +1116,11 @@ TOOLBAR_DrawButton (const TOOLBAR_INFO *
2012         }
2013     }
2014
2015+#ifdef __REACTOS__
2016+    if (theme && !(dwItemCDFlag & TBCDRF_NOBACKGROUND))
2017+#else
2018     if (theme)
2019+#endif
2020     {
2021         int partId = drawSepDropDownArrow ? TP_SPLITBUTTON : TP_BUTTON;
2022         int stateId = TS_NORMAL;
2023@@ -1044,7 +1137,12 @@ TOOLBAR_DrawButton (const TOOLBAR_INFO *
2024
2025         DrawThemeBackground (theme, hdc, partId, stateId, &rc, NULL);
2026     }
2027+
2028+#ifdef __REACTOS__
2029+    if (!theme)
2030+#else
2031     else
2032+#endif
2033         TOOLBAR_DrawFrame(infoPtr, &tbcd, &rc, dwItemCDFlag);
2034
2035     if (drawSepDropDownArrow)
2036@@ -1570,9 +1668,14 @@ static inline SIZE TOOLBAR_MeasureButton
2037         /* ... add on the necessary padding */
2038         if (bValidImageList)
2039         {
2040+#ifdef __REACTOS__
2041+            sizeButton.cy += infoPtr->szPadding.cy;
2042+            if (!bHasBitmap)
2043+#else
2044             if (bHasBitmap)
2045                 sizeButton.cy += DEFPAD_CY;
2046             else
2047+#endif
2048                 sizeButton.cy += LISTPAD_CY;
2049         }
2050         else
2051@@ -1589,7 +1692,11 @@ static inline SIZE TOOLBAR_MeasureButton
2052     {
2053         if (bHasBitmap)
2054         {
2055+#ifdef __REACTOS__
2056+            sizeButton.cy = infoPtr->nBitmapHeight + infoPtr->szPadding.cy;
2057+#else
2058             sizeButton.cy = infoPtr->nBitmapHeight + DEFPAD_CY;
2059+#endif
2060             if (sizeString.cy > 0)
2061                 sizeButton.cy += 1 + sizeString.cy;
2062             sizeButton.cx = infoPtr->szPadding.cx +
2063@@ -1603,6 +1710,12 @@ static inline SIZE TOOLBAR_MeasureButton
2064                 max(2*GetSystemMetrics(SM_CXEDGE) + sizeString.cx, infoPtr->nBitmapWidth);
2065         }
2066     }
2067+
2068+#ifdef __REACTOS__
2069+    sizeButton.cx += infoPtr->themeMargins.cxLeftWidth + infoPtr->themeMargins.cxRightWidth;
2070+    sizeButton.cy += infoPtr->themeMargins.cyTopHeight + infoPtr->themeMargins.cyBottomHeight;
2071+#endif
2072+
2073     return sizeButton;
2074 }
2075
2076@@ -1695,7 +1808,14 @@ TOOLBAR_LayoutToolbar(TOOLBAR_INFO *info
2077 	{
2078             if (btnPtr->cx)
2079               cx = btnPtr->cx;
2080+#ifdef __REACTOS__
2081+            /* Revert Wine Commit 5b7b911 as it breaks Explorer Toolbar Buttons
2082+               FIXME: Revisit this when the bug is fixed. CORE-9970 */
2083+            else if ((infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) ||
2084+                (btnPtr->fsStyle & BTNS_AUTOSIZE))
2085+#else
2086             else if (btnPtr->fsStyle & BTNS_AUTOSIZE)
2087+#endif
2088             {
2089               SIZE sz;
2090 	      HDC hdc;
2091@@ -1747,14 +1867,14 @@ TOOLBAR_LayoutToolbar(TOOLBAR_INFO *info
2092 	if( bWrap )
2093 	{
2094 	    if ( !(btnPtr->fsStyle & BTNS_SEP) )
2095-	        y += cy;
2096+	        y += cy + infoPtr->szSpacing.cy;
2097 	    else
2098 	    {
2099                if ( !(infoPtr->dwStyle & CCS_VERT))
2100                     y += cy + ( (btnPtr->cx > 0 ) ?
2101                                 btnPtr->cx : SEPARATOR_WIDTH) * 2 /3;
2102 		else
2103-		    y += cy;
2104+		    y += cy + infoPtr->szSpacing.cy;
2105
2106 		/* nSepRows is used to calculate the extra height following  */
2107 		/* the last row.					     */
2108@@ -1768,7 +1888,7 @@ TOOLBAR_LayoutToolbar(TOOLBAR_INFO *info
2109 		nRows++;
2110 	}
2111 	else
2112-	    x += cx;
2113+	    x += cx + infoPtr->szSpacing.cx;
2114     }
2115
2116     /* infoPtr->nRows is the number of rows on the toolbar */
2117@@ -3540,6 +3660,34 @@ TOOLBAR_GetMaxSize (const TOOLBAR_INFO *
2118     return TRUE;
2119 }
2120
2121+#ifdef __REACTOS__
2122+static LRESULT
2123+TOOLBAR_GetMetrics(const TOOLBAR_INFO *infoPtr, TBMETRICS *pMetrics)
2124+{
2125+    if (pMetrics == NULL || pMetrics->cbSize != sizeof(TBMETRICS))
2126+        return 0;
2127+
2128+    if (pMetrics->dwMask & TBMF_PAD)
2129+    {
2130+        pMetrics->cxPad = infoPtr->szPadding.cx;
2131+        pMetrics->cyPad = infoPtr->szPadding.cy;
2132+    }
2133+
2134+    if (pMetrics->dwMask & TBMF_BARPAD)
2135+    {
2136+        pMetrics->cxBarPad = infoPtr->szBarPadding.cx;
2137+        pMetrics->cyBarPad = infoPtr->szBarPadding.cy;
2138+    }
2139+
2140+    if (pMetrics->dwMask & TBMF_BUTTONSPACING)
2141+    {
2142+        pMetrics->cxButtonSpacing = infoPtr->szSpacing.cx;
2143+        pMetrics->cyButtonSpacing = infoPtr->szSpacing.cy;
2144+    }
2145+
2146+    return 0;
2147+}
2148+#endif
2149
2150 /* << TOOLBAR_GetObject >> */
2151
2152@@ -4337,7 +4485,7 @@ TOOLBAR_SetBitmapSize (TOOLBAR_INFO *inf
2153     short width = (short)LOWORD(lParam);
2154     short height = (short)HIWORD(lParam);
2155
2156-    TRACE("hwnd=%p, wParam=%ld, size %d x %d\n", infoPtr->hwndSelf, wParam, width, height);
2157+    TRACE("hwnd=%p, wParam=%ld, lParam=%ld\n", infoPtr->hwndSelf, wParam, lParam);
2158
2159     if (wParam != 0)
2160         FIXME("wParam is %ld. Perhaps image list index?\n", wParam);
2161@@ -4455,8 +4603,13 @@ TOOLBAR_SetButtonSize (TOOLBAR_INFO *inf
2162     if (cx == 0) cx = 24;
2163     if (cy == 0) cy = 22;
2164
2165+#ifdef __REACTOS__
2166+    cx = max(cx, infoPtr->szPadding.cx + infoPtr->nBitmapWidth + infoPtr->themeMargins.cxLeftWidth + infoPtr->themeMargins.cxRightWidth);
2167+    cy = max(cy, infoPtr->szPadding.cy + infoPtr->nBitmapHeight + infoPtr->themeMargins.cyTopHeight + infoPtr->themeMargins.cyBottomHeight);
2168+#else
2169     cx = max(cx, infoPtr->szPadding.cx + infoPtr->nBitmapWidth);
2170     cy = max(cy, infoPtr->szPadding.cy + infoPtr->nBitmapHeight);
2171+#endif
2172
2173     if (cx != infoPtr->nButtonWidth || cy != infoPtr->nButtonHeight ||
2174         top != infoPtr->iTopMargin)
2175@@ -4794,6 +4947,44 @@ TOOLBAR_SetMaxTextRows (TOOLBAR_INFO *in
2176     return TRUE;
2177 }
2178
2179+#ifdef __REACTOS__
2180+static LRESULT
2181+TOOLBAR_SetMetrics(TOOLBAR_INFO *infoPtr, TBMETRICS *pMetrics)
2182+{
2183
2184+    BOOL changed = FALSE;
2185+
2186+    if (!pMetrics)
2187+        return FALSE;
2188+
2189+    /* TODO: check if cbSize is a valid value */
2190+
2191+    if (pMetrics->dwMask & TBMF_PAD)
2192+    {
2193+        infoPtr->szPadding.cx = pMetrics->cxPad;
2194+        infoPtr->szPadding.cy = pMetrics->cyPad;
2195+        changed = TRUE;
2196+    }
2197+
2198+    if (pMetrics->dwMask & TBMF_PAD)
2199+    {
2200+        infoPtr->szBarPadding.cx = pMetrics->cxBarPad;
2201+        infoPtr->szBarPadding.cy = pMetrics->cyBarPad;
2202+        changed = TRUE;
2203+    }
2204+
2205+    if (pMetrics->dwMask & TBMF_BUTTONSPACING)
2206+    {
2207+        infoPtr->szSpacing.cx = pMetrics->cxButtonSpacing;
2208+        infoPtr->szSpacing.cy = pMetrics->cyButtonSpacing;
2209+        changed = TRUE;
2210+    }
2211+
2212+    if (changed)
2213+        TOOLBAR_CalcToolbar(infoPtr);
2214+
2215+    return TRUE;
2216+}
2217+#endif
2218
2219 /* MSDN gives slightly wrong info on padding.
2220  * 1. It is not only used on buttons with the BTNS_AUTOSIZE style
2221@@ -5083,6 +5274,16 @@ TOOLBAR_SetVersion (TOOLBAR_INFO *infoPt
2222 {
2223     INT iOldVersion = infoPtr->iVersion;
2224
2225+#ifdef __REACTOS__
2226+    /* The v6 control doesn't support changing its version */
2227+    if (iOldVersion == 6)
2228+        return iOldVersion;
2229+
2230+    /* And a control that is not v6 can't be set to be a v6 one */
2231+    if (iVersion >= 6)
2232+        return -1;
2233+#endif
2234+
2235     infoPtr->iVersion = iVersion;
2236
2237     if (infoPtr->iVersion >= 5)
2238@@ -5269,8 +5470,16 @@ TOOLBAR_Create (HWND hwnd, const CREATES
2239
2240     SystemParametersInfoW (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
2241     infoPtr->hFont = infoPtr->hDefaultFont = CreateFontIndirectW (&logFont);
2242-
2243+
2244+#ifdef __REACTOS__
2245+    {
2246+        HTHEME theme = OpenThemeData (hwnd, themeClass);
2247+        if (theme)
2248+            GetThemeMargins(theme, NULL, TP_BUTTON, TS_NORMAL, TMT_CONTENTMARGINS, NULL, &infoPtr->themeMargins);
2249+    }
2250+#else
2251     OpenThemeData (hwnd, themeClass);
2252+#endif
2253
2254     TOOLBAR_CheckStyle (infoPtr);
2255
2256@@ -5993,7 +6202,11 @@ TOOLBAR_NCCalcSize (HWND hwnd, WPARAM wP
2257
2258
2259 static LRESULT
2260+#ifdef __REACTOS__
2261+TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, const CREATESTRUCTW *lpcs, int iVersion)
2262+#else
2263 TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, const CREATESTRUCTW *lpcs)
2264+#endif
2265 {
2266     TOOLBAR_INFO *infoPtr;
2267     DWORD styleadd = 0;
2268@@ -6027,13 +6240,22 @@ TOOLBAR_NCCreate (HWND hwnd, WPARAM wPar
2269     infoPtr->dwDTFlags = (lpcs->style & TBSTYLE_LIST) ? DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS: DT_CENTER | DT_END_ELLIPSIS;
2270     infoPtr->bAnchor = FALSE; /* no anchor highlighting */
2271     infoPtr->bDragOutSent = FALSE;
2272+#ifdef __REACTOS__
2273+    infoPtr->iVersion = iVersion;
2274+#else
2275     infoPtr->iVersion = 0;
2276+#endif
2277     infoPtr->hwndSelf = hwnd;
2278     infoPtr->bDoRedraw = TRUE;
2279     infoPtr->clrBtnHighlight = CLR_DEFAULT;
2280     infoPtr->clrBtnShadow = CLR_DEFAULT;
2281     infoPtr->szPadding.cx = DEFPAD_CX;
2282     infoPtr->szPadding.cy = DEFPAD_CY;
2283+#ifdef __REACTOS__
2284+    infoPtr->szSpacing.cx = 0;
2285+    infoPtr->szSpacing.cy = 0;
2286+    memset(&infoPtr->themeMargins, 0 , sizeof(infoPtr->themeMargins));
2287+#endif
2288     infoPtr->iListGap = DEFLISTGAP;
2289     infoPtr->iTopMargin = default_top_margin(infoPtr);
2290     infoPtr->dwStyle = lpcs->style;
2291@@ -6443,8 +6665,22 @@ TOOLBAR_SysColorChange (void)
2292     return 0;
2293 }
2294
2295-
2296+#ifdef __REACTOS__
2297 /* update theme after a WM_THEMECHANGED message */
2298+static LRESULT theme_changed (TOOLBAR_INFO *infoPtr)
2299+{
2300+    HTHEME theme = GetWindowTheme (infoPtr->hwndSelf);
2301+    CloseThemeData (theme);
2302+    OpenThemeData (infoPtr->hwndSelf, themeClass);
2303+    theme = GetWindowTheme (infoPtr->hwndSelf);
2304+    if (theme)
2305+        GetThemeMargins(theme, NULL, TP_BUTTON, TS_NORMAL, TMT_CONTENTMARGINS, NULL, &infoPtr->themeMargins);
2306+    else
2307+        memset(&infoPtr->themeMargins, 0 ,sizeof(infoPtr->themeMargins));
2308+
2309+    return 0;
2310+}
2311+#else
2312 static LRESULT theme_changed (HWND hwnd)
2313 {
2314     HTHEME theme = GetWindowTheme (hwnd);
2315@@ -6452,7 +6688,7 @@ static LRESULT theme_changed (HWND hwnd)
2316     OpenThemeData (hwnd, themeClass);
2317     return 0;
2318 }
2319-
2320+#endif
2321
2322 static LRESULT WINAPI
2323 ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
2324@@ -6557,6 +6793,10 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg,
2325
2326 	case TB_GETMAXSIZE:
2327 	    return TOOLBAR_GetMaxSize (infoPtr, (LPSIZE)lParam);
2328+#ifdef __REACTOS__
2329+	case TB_GETMETRICS:
2330+	    return TOOLBAR_GetMetrics (infoPtr, (TBMETRICS*)lParam);
2331+#endif
2332
2333 /*	case TB_GETOBJECT:			*/ /* 4.71 */
2334
2335@@ -6698,6 +6938,11 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg,
2336 	case TB_SETMAXTEXTROWS:
2337 	    return TOOLBAR_SetMaxTextRows (infoPtr, wParam);
2338
2339+#ifdef __REACTOS__
2340+	case TB_SETMETRICS:
2341+	    return TOOLBAR_SetMetrics (infoPtr, (TBMETRICS*)lParam);
2342+#endif
2343+
2344 	case TB_SETPADDING:
2345 	    return TOOLBAR_SetPadding (infoPtr, lParam);
2346
2347@@ -6805,7 +7050,11 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg,
2348 	    return TOOLBAR_NCCalcSize (hwnd, wParam, lParam);
2349
2350 	case WM_NCCREATE:
2351+#ifdef __REACTOS__
2352+	    return TOOLBAR_NCCreate (hwnd, wParam, (CREATESTRUCTW*)lParam, 0);
2353+#else
2354 	    return TOOLBAR_NCCreate (hwnd, wParam, (CREATESTRUCTW*)lParam);
2355+#endif
2356
2357 	case WM_NCPAINT:
2358 	    return TOOLBAR_NCPaint (hwnd, wParam, lParam);
2359@@ -6837,9 +7086,12 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg,
2360
2361 	case WM_SYSCOLORCHANGE:
2362 	    return TOOLBAR_SysColorChange ();
2363-
2364-        case WM_THEMECHANGED:
2365+    case WM_THEMECHANGED:
2366+#ifdef __REACTOS__
2367+            return theme_changed (infoPtr);
2368+#else
2369             return theme_changed (hwnd);
2370+#endif
2371
2372 /*	case WM_WININICHANGE: */
2373
2374@@ -6887,6 +7139,40 @@ TOOLBAR_Unregister (void)
2375     UnregisterClassW (TOOLBARCLASSNAMEW, NULL);
2376 }
2377
2378+#ifdef __REACTOS__
2379+static LRESULT WINAPI
2380+ToolbarV6WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
2381+{
2382+    if (uMsg == WM_NCCREATE)
2383+        return TOOLBAR_NCCreate (hwnd, wParam, (CREATESTRUCTW*)lParam, 6);
2384+    else
2385+        return ToolbarWindowProc(hwnd, uMsg, wParam, lParam);
2386+}
2387+
2388+VOID
2389+TOOLBARv6_Register (void)
2390+{
2391+    WNDCLASSW wndClass;
2392+
2393+    ZeroMemory (&wndClass, sizeof(WNDCLASSW));
2394+    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS;
2395+    wndClass.lpfnWndProc   = ToolbarV6WindowProc;
2396+    wndClass.cbClsExtra    = 0;
2397+    wndClass.cbWndExtra    = sizeof(TOOLBAR_INFO *);
2398+    wndClass.hCursor       = LoadCursorW (0, (LPWSTR)IDC_ARROW);
2399+    wndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
2400+    wndClass.lpszClassName = TOOLBARCLASSNAMEW;
2401+
2402+    RegisterClassW (&wndClass);
2403+}
2404+
2405+VOID
2406+TOOLBARv6_Unregister (void)
2407+{
2408+    UnregisterClassW (TOOLBARCLASSNAMEW, NULL);
2409+}
2410+#endif
2411+
2412 static HIMAGELIST TOOLBAR_InsertImageList(PIMLENTRY **pies, INT *cies, HIMAGELIST himl, INT id)
2413 {
2414     HIMAGELIST himlold;
2415diff -pudN e:\wine\dlls\comctl32/tooltips.c e:\reactos\dll\win32\comctl32/tooltips.c
2416--- e:\wine\dlls\comctl32/tooltips.c	2017-09-07 12:58:14 +0100
2417+++ e:\reactos\dll\win32\comctl32/tooltips.c	2017-02-13 10:18:27 +0100
2418@@ -2009,7 +2009,36 @@ TOOLTIPS_NCHitTest (const TOOLTIPS_INFO
2419 static LRESULT
2420 TOOLTIPS_NotifyFormat (TOOLTIPS_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
2421 {
2422+#ifdef __REACTOS__
2423+    TTTOOL_INFO *toolPtr = infoPtr->tools;
2424+    LRESULT nResult;
2425+
2426+    TRACE("infoPtr=%p wParam=%lx lParam=%p\n", infoPtr, wParam, (PVOID)lParam);
2427+
2428+    if (lParam == NF_QUERY) {
2429+        if (toolPtr->bNotifyUnicode) {
2430+            return NFR_UNICODE;
2431+        } else {
2432+            return NFR_ANSI;
2433+        }
2434+    }
2435+    else if (lParam == NF_REQUERY) {
2436+        nResult = SendMessageW (toolPtr->hwnd, WM_NOTIFYFORMAT,
2437+                    (WPARAM)infoPtr->hwndSelf, (LPARAM)NF_QUERY);
2438+        if (nResult == NFR_ANSI) {
2439+            toolPtr->bNotifyUnicode = FALSE;
2440+            TRACE(" -- WM_NOTIFYFORMAT returns: NFR_ANSI\n");
2441+        } else if (nResult == NFR_UNICODE) {
2442+            toolPtr->bNotifyUnicode = TRUE;
2443+            TRACE(" -- WM_NOTIFYFORMAT returns: NFR_UNICODE\n");
2444+        } else {
2445+            TRACE (" -- WM_NOTIFYFORMAT returns: error!\n");
2446+        }
2447+        return nResult;
2448+    }
2449+#else
2450     FIXME ("hwnd=%p wParam=%lx lParam=%lx\n", infoPtr->hwndSelf, wParam, lParam);
2451+#endif
2452
2453     return 0;
2454 }
2455diff -pudN e:\wine\dlls\comctl32/trackbar.c e:\reactos\dll\win32\comctl32/trackbar.c
2456--- e:\wine\dlls\comctl32/trackbar.c	2017-09-07 12:58:14 +0100
2457+++ e:\reactos\dll\win32\comctl32/trackbar.c	2017-05-07 14:47:57 +0100
2458@@ -938,7 +938,11 @@ TRACKBAR_Refresh (TRACKBAR_INFO *infoPtr
2459         if (GetWindowTheme (infoPtr->hwndSelf)) {
2460             DrawThemeParentBackground (infoPtr->hwndSelf, hdc, 0);
2461         }
2462+#ifndef __REACTOS__
2463         else {
2464+#else
2465+        {
2466+#endif
2467             HBRUSH brush = (HBRUSH)SendMessageW(infoPtr->hwndNotify, WM_CTLCOLORSTATIC,
2468                     (WPARAM)hdc, (LPARAM)infoPtr->hwndSelf);
2469             FillRect (hdc, &rcClient, brush ? brush : GetSysColorBrush(COLOR_BTNFACE));
2470diff -pudN e:\wine\dlls\comctl32/treeview.c e:\reactos\dll\win32\comctl32/treeview.c
2471--- e:\wine\dlls\comctl32/treeview.c	2017-09-07 12:58:14 +0100
2472+++ e:\reactos\dll\win32\comctl32/treeview.c	2017-05-21 20:35:33 +0100
2473@@ -2911,7 +2911,14 @@ TREEVIEW_Refresh(TREEVIEW_INFO *infoPtr,
2474 	}
2475     }
2476
2477+    //
2478+    // FIXME: This is correct, but is causes and infinite loop of WM_PAINT
2479+    // messages, resulting in continuous painting of the scroll bar in reactos.
2480+    // Comment out until the real bug is found. CORE-4912
2481+    //
2482+#ifndef __REACTOS__
2483     TREEVIEW_UpdateScrollBars(infoPtr);
2484+#endif
2485
2486     if (infoPtr->cdmode & CDRF_NOTIFYPOSTPAINT)
2487 	infoPtr->cdmode =
2488@@ -5439,8 +5446,15 @@ static BOOL TREEVIEW_NCPaint (const TREE
2489         CombineRgn (cliprgn, cliprgn, region, RGN_AND);
2490     OffsetRect(&r, -r.left, -r.top);
2491
2492+#ifdef __REACTOS__ /* r73789 */
2493+    dc = GetWindowDC(infoPtr->hwnd);
2494+    /* Exclude client part */
2495+    ExcludeClipRect(dc, r.left + cxEdge, r.top + cyEdge,
2496+        r.right - cxEdge, r.bottom -cyEdge);
2497+#else
2498     dc = GetDCEx(infoPtr->hwnd, region, DCX_WINDOW|DCX_INTERSECTRGN);
2499     OffsetRect(&r, -r.left, -r.top);
2500+#endif
2501
2502     if (IsThemeBackgroundPartiallyTransparent (theme, 0, 0))
2503         DrawThemeParentBackground(infoPtr->hwnd, dc, &r);
2504diff -pudN e:\wine\dlls\comctl32/idc_divider.cur e:\reactos\dll\win32\comctl32/idc_divider.cur
2505#is kept at older state of ros SVN r75877 to avoid CORE-14144
2506diff -pudN e:\wine\dlls\comctl32/idc_divideropen.cur e:\reactos\dll\win32\comctl32/idc_divideropen.cur
2507#is kept at older state of ros SVN r75877 to avoid CORE-14144
2508