summaryrefslogtreecommitdiff
path: root/alf/alfcompat.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'alf/alfcompat.cpp')
-rw-r--r--alf/alfcompat.cpp61
1 files changed, 57 insertions, 4 deletions
diff --git a/alf/alfcompat.cpp b/alf/alfcompat.cpp
index 452b9bc..3ffc9f9 100644
--- a/alf/alfcompat.cpp
+++ b/alf/alfcompat.cpp
@@ -1,21 +1,74 @@
#include "alfpriv.h"
+#include <shlwapi.h>
+
+static
+DWORD ALF_DllGetVersion(const char *dll)
+{
+ HMODULE hDll = GetModuleHandleA(dll);
+
+ if (hDll) {
+ DLLGETVERSIONPROC pDllGetVersion;
+ pDllGetVersion = (DLLGETVERSIONPROC)(void*)GetProcAddress(hDll, "DllGetVersion");
+
+ if (pDllGetVersion) {
+ DLLVERSIONINFO dvi;
+ HRESULT hr;
+
+ ZeroMemory(&dvi, sizeof(dvi));
+ dvi.cbSize = sizeof(dvi);
+
+ hr = (*pDllGetVersion)(&dvi);
+
+ if (SUCCEEDED(hr)) {
+ return MAKELONG(dvi.dwMinorVersion, dvi.dwMajorVersion);
+ }
+ }
+ }
+ return 0;
+}
+
+static int WINAPI
+fallbackGetSystemMetricsForDpi(int nIndex, UINT dpi)
+{
+ (void)dpi;
+ return GetSystemMetrics(nIndex);
+}
+
+static BOOL WINAPI
+fallbackIsAppThemed(void)
+{
+ return FALSE;
+}
+
ALFCompatFunctions *
ALF_CreateCompatFuncTable(void)
{
ALFCompatFunctions *compatfn = (ALFCompatFunctions*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY|HEAP_GENERATE_EXCEPTIONS, sizeof(ALFCompatFunctions));
-#define COMPAT(dll, entrypoint, ordinal) \
+#define COMPAT(dll, entrypoint, ordinal, fallback) \
do { \
FARPROC p = GetProcAddress(GetModuleHandleA(#dll), #entrypoint); \
if (!p && ordinal) \
p = GetProcAddress(GetModuleHandleA(#dll), (char*)ordinal); \
CopyMemory(&compatfn->entrypoint, &p, sizeof(void*)); \
+ \
+ if (!compatfn->entrypoint) \
+ compatfn->entrypoint = fallback; \
} while (0)
- COMPAT(comctl32.dll, SetWindowSubclass, 410);
- COMPAT(comctl32.dll, DefSubclassProc, 413);
- COMPAT(comctl32.dll, RemoveWindowSubclass, 412);
+ COMPAT(comctl32.dll, SetWindowSubclass, 410, NULL);
+ COMPAT(comctl32.dll, DefSubclassProc, 413, NULL);
+ COMPAT(comctl32.dll, RemoveWindowSubclass, 412, NULL);
+ COMPAT(user32.dll, GetSystemMetricsForDpi, 0, fallbackGetSystemMetricsForDpi);
+
+ // IsAppThemed would return TRUE even when we're linked against comctl32 v5
+ if (ALF_DllGetVersion("comctl32.dll") >= 0x60000) {
+ LoadLibraryA("uxtheme.dll");
+ COMPAT(uxtheme.dll, IsAppThemed, 0, fallbackIsAppThemed);
+ } else {
+ compatfn->IsAppThemed = fallbackIsAppThemed;
+ }
#undef COMPAT