--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\r
+ <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="5.82.2600.2982" publicKeyToken="6595b64144ccf1df"/>\r
+ <file name="comctl32.dll">\r
+ <windowClass versioned="no">Button</windowClass>\r
+ <windowClass versioned="no">ButtonListBox</windowClass>\r
+ <windowClass versioned="no">ComboBoxEx32</windowClass>\r
+ <windowClass versioned="no">ComboLBox</windowClass>\r
+ <windowClass versioned="no">Combobox</windowClass>\r
+ <windowClass versioned="no">Edit</windowClass>\r
+ <windowClass versioned="no">Listbox</windowClass>\r
+ <windowClass versioned="no">NativeFontCtl</windowClass>\r
+ <windowClass versioned="no">ReBarWindow32</windowClass>\r
+ <windowClass versioned="no">ScrollBar</windowClass>\r
+ <windowClass versioned="no">SysAnimate32</windowClass>\r
+ <windowClass versioned="no">SysDateTimePick32</windowClass>\r
+ <windowClass versioned="no">SysHeader32</windowClass>\r
+ <windowClass versioned="no">SysIPAddress32</windowClass>\r
+ <windowClass versioned="no">SysLink</windowClass>\r
+ <windowClass versioned="no">SysListView32</windowClass>\r
+ <windowClass versioned="no">SysMonthCal32</windowClass>\r
+ <windowClass versioned="no">SysPager</windowClass>\r
+ <windowClass versioned="no">SysTabControl32</windowClass>\r
+ <windowClass versioned="no">SysTreeView32</windowClass>\r
+ <windowClass versioned="no">ToolbarWindow32</windowClass>\r
+ <windowClass versioned="no">msctls_hotkey32</windowClass>\r
+ <windowClass versioned="no">msctls_progress32</windowClass>\r
+ <windowClass versioned="no">msctls_statusbar32</windowClass>\r
+ <windowClass versioned="no">msctls_trackbar32</windowClass>\r
+ <windowClass versioned="no">msctls_updown32</windowClass>\r
+ <windowClass versioned="no">tooltips_class32</windowClass>\r
+ </file>\r
+</assembly>\r
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
-#define NAME L"microsoft.windows.common-controls"
-#define VERSION L"6.0.2600.2982"
-#define PUBLIC_KEY L"6595b64144ccf1df"
-
-#ifdef __i386__
-#define ARCH L"x86"
-#elif defined __x86_64__
-#define ARCH L"amd64"
-#else
-#define ARCH L"none"
-#endif
-
-static const WCHAR manifest_filename[] = ARCH L"_" NAME L"_" PUBLIC_KEY L"_" VERSION L"_none_deadbeef.manifest";
-
static LRESULT WINAPI COMCTL32_SubclassProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
static LPWSTR COMCTL32_wSubclass = NULL;
'C','C','3','2','S','u','b','c','l','a','s','s','I','n','f','o',0
};
-static BOOL create_manifest(BOOL install)
+#ifdef __REACTOS__
+
+#include <strsafe.h>
+
+#define NAME L"microsoft.windows.common-controls"
+#define VERSION_V5 L"5.82.2600.2982"
+#define VERSION L"6.0.2600.2982"
+#define PUBLIC_KEY L"6595b64144ccf1df"
+
+#ifdef __i386__
+#define ARCH L"x86"
+#elif defined __x86_64__
+#define ARCH L"amd64"
+#else
+#define ARCH L"none"
+#endif
+
+static const WCHAR manifest_filename[] = ARCH L"_" NAME L"_" PUBLIC_KEY L"_" VERSION L"_none_deadbeef.manifest";
+static const WCHAR manifest_filename_v5[] = ARCH L"_" NAME L"_" PUBLIC_KEY L"_" VERSION_V5 L"_none_deadbeef.manifest";
+
+static WCHAR* GetManifestPath(BOOL create, BOOL bV6)
+{
+ WCHAR *pwszBuf;
+ HRESULT hres;
+
+ pwszBuf = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR));
+ if (!pwszBuf)
+ return NULL;
+
+ GetWindowsDirectoryW(pwszBuf, MAX_PATH);
+ hres = StringCchCatW(pwszBuf, MAX_PATH, L"\\winsxs");
+ if (FAILED(hres))
+ return NULL;
+ if (create)
+ CreateDirectoryW(pwszBuf, NULL);
+ hres = StringCchCatW(pwszBuf, MAX_PATH, L"\\manifests\\");
+ if (FAILED(hres))
+ return NULL;
+ if (create)
+ CreateDirectoryW(pwszBuf, NULL);
+
+ hres = StringCchCatW(pwszBuf, MAX_PATH, bV6 ? manifest_filename : manifest_filename_v5);
+ if (FAILED(hres))
+ return NULL;
+
+ return pwszBuf;
+}
+
+static BOOL create_manifest(BOOL install, BOOL bV6)
{
WCHAR *pwszBuf;
HRSRC hResInfo;
HGLOBAL hResData;
PVOID pManifest;
- DWORD cchBuf, cbManifest, cbWritten;
+ DWORD cbManifest, cbWritten;
HANDLE hFile;
BOOL bRet = FALSE;
- hResInfo = FindResourceW(COMCTL32_hModule, L"WINE_MANIFEST", (LPWSTR)RT_MANIFEST);
+ if (bV6)
+ hResInfo = FindResourceW(COMCTL32_hModule, L"WINE_MANIFEST", (LPWSTR)RT_MANIFEST);
+ else
+ hResInfo = FindResourceW(COMCTL32_hModule, L"WINE_MANIFESTV5", (LPWSTR)RT_MANIFEST);
+
if (!hResInfo)
return FALSE;
if (!pManifest)
return FALSE;
- cchBuf = GetWindowsDirectoryW(NULL, 0) * sizeof(WCHAR) + sizeof(L"\\winsxs\\manifests\\") + sizeof(manifest_filename);
- pwszBuf = (WCHAR*)HeapAlloc(GetProcessHeap(), 0, cchBuf * sizeof(WCHAR));
+ pwszBuf = GetManifestPath(TRUE, bV6);
if (!pwszBuf)
return FALSE;
- GetWindowsDirectoryW(pwszBuf, cchBuf);
- lstrcatW(pwszBuf, L"\\winsxs");
- CreateDirectoryW(pwszBuf, NULL);
- lstrcatW(pwszBuf, L"\\manifests\\");
- CreateDirectoryW(pwszBuf, NULL);
- lstrcatW(pwszBuf, manifest_filename);
if (install)
{
hFile = CreateFileW(pwszBuf, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
return bRet;
}
+static HANDLE CreateComctl32ActCtx(BOOL bV6)
+{
+ HANDLE ret;
+ WCHAR* pwstrSource;
+ ACTCTXW ActCtx = {sizeof(ACTCTX)};
+
+ pwstrSource = GetManifestPath(FALSE, bV6);
+ if (!pwstrSource)
+ {
+ ERR("GetManifestPath failed! bV6=%d\n", bV6);
+ return INVALID_HANDLE_VALUE;
+ }
+ ActCtx.lpSource = pwstrSource;
+ ret = CreateActCtxW(&ActCtx);
+ HeapFree(GetProcessHeap(), 0, pwstrSource);
+ if (ret == INVALID_HANDLE_VALUE)
+ ERR("CreateActCtxW failed! bV6=%d\n", bV6);
+ return ret;
+}
+
+static void RegisterControls()
+{
+ ANIMATE_Register ();
+ COMBOEX_Register ();
+ DATETIME_Register ();
+ FLATSB_Register ();
+ HEADER_Register ();
+ HOTKEY_Register ();
+ IPADDRESS_Register ();
+ LISTVIEW_Register ();
+ MONTHCAL_Register ();
+ NATIVEFONT_Register ();
+ PAGER_Register ();
+ PROGRESS_Register ();
+ REBAR_Register ();
+ STATUS_Register ();
+ SYSLINK_Register ();
+ TAB_Register ();
+ TOOLBAR_Register ();
+ TOOLTIPS_Register ();
+ TRACKBAR_Register ();
+ TREEVIEW_Register ();
+ UPDOWN_Register ();
+}
+
+static void UnregisterControls()
+{
+ ANIMATE_Unregister ();
+ COMBOEX_Unregister ();
+ DATETIME_Unregister ();
+ FLATSB_Unregister ();
+ HEADER_Unregister ();
+ HOTKEY_Unregister ();
+ IPADDRESS_Unregister ();
+ LISTVIEW_Unregister ();
+ MONTHCAL_Unregister ();
+ NATIVEFONT_Unregister ();
+ PAGER_Unregister ();
+ PROGRESS_Unregister ();
+ REBAR_Unregister ();
+ STATUS_Unregister ();
+ SYSLINK_Unregister ();
+ TAB_Unregister ();
+ TOOLBAR_Unregister ();
+ TOOLTIPS_Unregister ();
+ TRACKBAR_Unregister ();
+ TREEVIEW_Unregister ();
+ UPDOWN_Unregister ();
+}
+
+static void InitializeClasses()
+{
+ HANDLE hActCtx5, hActCtx6;
+ BOOL activated;
+ ULONG_PTR ulCookie;
+
+ /* like comctl32 5.82+ register all the common control classes */
+ /* Register the classes once no matter what */
+ hActCtx5 = CreateComctl32ActCtx(FALSE);
+ activated = (hActCtx5 != INVALID_HANDLE_VALUE ? ActivateActCtx(hActCtx5, &ulCookie) : FALSE);
+ RegisterControls(); /* Register the classes pretending to be v5 */
+ if (activated) DeactivateActCtx(0, ulCookie);
+
+ hActCtx6 = CreateComctl32ActCtx(TRUE);
+ if (hActCtx6 != INVALID_HANDLE_VALUE)
+ {
+ activated = ActivateActCtx(hActCtx6, &ulCookie);
+ RegisterControls(); /* Register the classes pretending to be v6 */
+ if (activated) DeactivateActCtx(0, ulCookie);
+
+ /* Initialize the themed controls only when the v6 manifest is present */
+ THEMING_Initialize (hActCtx5, hActCtx6);
+ }
+}
+
+static void UninitializeClasses()
+{
+ HANDLE hActCtx5, hActCtx6;
+ BOOL activated;
+ ULONG_PTR ulCookie;
+
+ hActCtx5 = CreateComctl32ActCtx(FALSE);
+ activated = (hActCtx5 != INVALID_HANDLE_VALUE ? ActivateActCtx(hActCtx5, &ulCookie) : FALSE);
+ UnregisterControls();
+ if (activated) DeactivateActCtx(0, ulCookie);
+
+ hActCtx6 = CreateComctl32ActCtx(TRUE);
+ if (hActCtx6 != INVALID_HANDLE_VALUE)
+ {
+ activated = ActivateActCtx(hActCtx6, &ulCookie);
+ THEMING_Uninitialize();
+ UnregisterControls();
+ if (activated) DeactivateActCtx(0, ulCookie);
+ }
+}
+
+/***********************************************************************
+ * RegisterClassNameW [COMCTL32.@]
+ *
+ * Register window class again while using as SxS module.
+ */
+BOOLEAN WINAPI RegisterClassNameW(LPCWSTR className)
+{
+ InitializeClasses();
+ return TRUE;
+}
+
+#endif
/***********************************************************************
* DllMain [Internal]
/* Get all the colors at DLL load */
COMCTL32_RefreshSysColors();
+#ifndef __REACTOS__
/* like comctl32 5.82+ register all the common control classes */
ANIMATE_Register ();
COMBOEX_Register ();
/* subclass user32 controls */
THEMING_Initialize ();
+#else
+ InitializeClasses();
+#endif
+
break;
case DLL_PROCESS_DETACH:
if (lpvReserved) break;
+#ifndef __REACTOS__
/* clean up subclassing */
THEMING_Uninitialize();
TRACKBAR_Unregister ();
TREEVIEW_Unregister ();
UPDOWN_Unregister ();
-
+#else
+ UninitializeClasses();
+#endif
/* delete local pattern brush */
DeleteObject (COMCTL32_hPattern55AABrush);
DeleteObject (COMCTL32_hPattern55AABitmap);
HRESULT WINAPI DllInstall(BOOL bInstall, LPCWSTR cmdline)
{
TRACE("(%u, %s): stub\n", bInstall, debugstr_w(cmdline));
- if (!create_manifest(bInstall))
+
+#ifdef __REACTOS__
+
+ if (!create_manifest(bInstall, TRUE))
+ {
+ ERR("Failed to install comctl32 v6 manifest!\n");
+ return HRESULT_FROM_WIN32(GetLastError());
+ }
+
+ if (!create_manifest(bInstall, FALSE))
{
- ERR("create_manifest failed!\n");
+ ERR("Failed to install comctl32 v5 manifest!\n");
return HRESULT_FROM_WIN32(GetLastError());
}
+#endif
return S_OK;
}
return LoadIconWithScaleDown(hinst, name, cx, cy, icon);
}
-
-/***********************************************************************
- * RegisterClassNameW [COMCTL32.@]
- *
- * Register window class again while using as SxS module.
- */
-BOOLEAN WINAPI RegisterClassNameW(LPCWSTR className)
-{
- /* FIXME: actually register redirected user32 class,
- comctl32 classes are registered by this module anyway */
- return TRUE;
-}
ULONG_PTR) DECLSPEC_HIDDEN;
extern LRESULT CALLBACK THEMING_ComboSubclassProc (HWND, UINT, WPARAM, LPARAM,
ULONG_PTR) DECLSPEC_HIDDEN;
-extern LRESULT CALLBACK THEMING_DialogSubclassProc (HWND, UINT, WPARAM, LPARAM,
- ULONG_PTR) DECLSPEC_HIDDEN;
extern LRESULT CALLBACK THEMING_EditSubclassProc (HWND, UINT, WPARAM, LPARAM,
ULONG_PTR) DECLSPEC_HIDDEN;
extern LRESULT CALLBACK THEMING_ListBoxSubclassProc (HWND, UINT, WPARAM, LPARAM,
THEMING_SUBCLASSPROC subclassProc;
} subclasses[] = {
/* Note: list must be sorted by class name */
- {dialogClass, THEMING_DialogSubclassProc},
{WC_BUTTONW, THEMING_ButtonSubclassProc},
{WC_COMBOBOXW, THEMING_ComboSubclassProc},
{comboLboxClass, THEMING_ListBoxSubclassProc},
MAKE_SUBCLASS_PROC(3)
MAKE_SUBCLASS_PROC(4)
MAKE_SUBCLASS_PROC(5)
-MAKE_SUBCLASS_PROC(6)
static const WNDPROC subclassProcs[NUM_SUBCLASSES] = {
subclass_proc0,
subclass_proc2,
subclass_proc3,
subclass_proc4,
- subclass_proc5,
- subclass_proc6
+ subclass_proc5
};
/***********************************************************************
* Register classes for standard controls that will shadow the system
* classes.
*/
-void THEMING_Initialize (void)
+void THEMING_Initialize (HANDLE hActCtx5, HANDLE hActCtx6)
{
unsigned int i;
static const WCHAR subclassPropName[] =
{ 'C','C','3','2','T','h','e','m','i','n','g','S','u','b','C','l',0 };
static const WCHAR refDataPropName[] =
{ 'C','C','3','2','T','h','e','m','i','n','g','D','a','t','a',0 };
-
- if (!IsThemeActive()) return;
+ ULONG_PTR ulCookie;
+ BOOL ret, bActivated;
atSubclassProp = GlobalAddAtomW (subclassPropName);
atRefDataProp = GlobalAddAtomW (refDataPropName);
WNDCLASSEXW class;
class.cbSize = sizeof(class);
- if (!GetClassInfoExW (NULL, subclasses[i].className, &class))
+
+ bActivated = ActivateActCtx(hActCtx5, &ulCookie);
+ ret = GetClassInfoExW (NULL, subclasses[i].className, &class);
+ if (bActivated)
+ DeactivateActCtx(0, ulCookie);
+
+ if (!ret)
{
ERR("Could not retrieve information for class %s\n",
debugstr_w (subclasses[i].className));
}
originalProcs[i] = class.lpfnWndProc;
class.lpfnWndProc = subclassProcs[i];
-
+ class.style |= CS_GLOBALCLASS;
+ class.hInstance = COMCTL32_hModule;
+
if (!class.lpfnWndProc)
{
ERR("Missing proc for class %s\n",
continue;
}
+ bActivated = ActivateActCtx(hActCtx6, &ulCookie);
+
if (!RegisterClassExW (&class))
{
- ERR("Could not re-register class %s: %x\n",
+ WARN("Could not re-register class %s: %x\n",
debugstr_w (subclasses[i].className), GetLastError ());
}
else
TRACE("Re-registered class %s\n",
debugstr_w (subclasses[i].className));
}
+
+ if (bActivated)
+ DeactivateActCtx(0, ulCookie);
}
}